Are you languishing in the trenches of SQL Views, UDFs, and ORM? Are you struggling to stay afloat in a massing pool of technical debt? Watch this now and be saved!
3. Theory
class Cat extends Animal
{
...
}
Practice
class ManagerFactory extends Factory {
...
}
Noun Verb
4. Theory
class Cat extends Animal
{
...
}
Practice
class ManagerFactory extends Factory {
Manager construct() {…}
} <- The Real verb
* https://steve-yegge.blogspot.com/2006/03/execution-in-kingdom-of-nouns.html
Noun Verb Chaperone
11. SELECT DISTINCT
account.name, alias,
CASE WHEN code = 'EV'
THEN cast(account.number AS VARCHAR)
ELSE cast(account.number AS VARCHAR) + substring(alias, 1, 2) END AS OFFICIAL_IDENTITY,
CASE WHEN order_permission IN ('A', 'S')
THEN 'ST' ELSE 'ENH' END
FROM (
SELECT DISTINCT mc.alias, mc.code, order_permission, mc.account_tag
FROM MERCHANT_CLIENTS mc
JOIN REGISTRY r ON r.alias = mc.alias
WHERE r.market = 'us' AND r.record_type = 'M'
UNION ALL
SELECT DISTINCT sc.alias, 'EV' AS code, part.order_permission, sc.account_tag
FROM SERVICE_CLIENTS sc
JOIN REGISTRY r ON r.alias = sc.alias AND r.record_type = 'S' AND r.market = 'us'
JOIN PARTNERSHIPS part ON part.id = sc.partnership_fk) client
INNER JOIN (
dbo.ACCOUNTS account
INNER JOIN ACCOUNT_TYPES accountType ON account.type = accountType.account_type
LEFT JOIN DEDICATED_ACCOUNTS dedicated ON dedicated.account_number = account.number)
ON (accountType.mapping_type = 0)
OR (accountType.mapping_type = 2 AND account.tag = client.account_tag)
OR (accountType.mapping_type = 1 AND dedicated.client_alias = client.alias)
13. SELECT DISTINCT
account.name, alias,
CASE (...) AS OFFICIAL_IDENTITY,
CASE (...)
FROM (
SELECT DISTINCT
mc.alias, mc.code, order_permission, mc.account_tag (code, alias, perm, tag)
FROM MERCHANT_CLIENTS mc
JOIN REGISTRY r ON (alias) AND (otherConditions)
UNION ALL
SELECT DISTINCT
sc.alias, 'EV' AS code, part.order_permission, sc.account_tag (code, alias, perm, tag)
FROM SERVICE_CLIENTS sc
JOIN REGISTRY r ON (alias) AND (otherConditions)
JOIN PARTNERSHIPS part ON (id <-> fk)) client
INNER JOIN (
dbo.ACCOUNTS account
INNER JOIN ACCOUNT_TYPES accountType ON (account_type)
LEFT JOIN DEDICATED_ACCOUNTS dedicated ON (account_number)
)
ON (possibly anything...)
OR (possibly the account tag...)
OR (possibly the alias...) → All Depending on the accountType
14. SELECT DISTINCT
account.name, alias,
CASE (...) AS OFFICIAL_IDENTITY,
CASE (...)
FROM (
SELECT DISTINCT
mc.alias, mc.code, order_permission, mc.account_tag (code, alias, perm, tag)
FROM MERCHANT_CLIENTS mc
JOIN REGISTRY r ON (alias) AND (otherConditions)
UNION ALL
SELECT DISTINCT
sc.alias, 'EV' AS code, part.order_permission, sc.account_tag (code, alias, perm, tag)
FROM SERVICE_CLIENTS sc
JOIN REGISTRY r ON (alias) AND (otherConditions)
JOIN PARTNERSHIPS part ON (id <-> fk)) client
INNER JOIN (
dbo.ACCOUNTS account
INNER JOIN ACCOUNT_TYPES accountType ON (account_type)
LEFT JOIN DEDICATED_ACCOUNTS dedicated ON (account_number)
)
ON (possibly anything...)
OR (possibly the account tag...)
OR (possibly the alias...) → All Depending on the accountType
15. SELECT DISTINCT
account.name, alias,
CASE (...) AS OFFICIAL_IDENTITY,
CASE (...)
FROM (
SELECT DISTINCT
mc.alias, mc.code, order_permission, mc.account_tag (code, alias, perm, tag)
FROM MERCHANT_CLIENTS mc
JOIN REGISTRY r ON (alias) AND (otherConditions)
UNION ALL
SELECT DISTINCT
sc.alias, 'EV' AS code, part.order_permission, sc.account_tag (code, alias, perm, tag)
FROM SERVICE_CLIENTS sc
JOIN REGISTRY r ON (alias) AND (otherConditions)
JOIN PARTNERSHIPS part ON (id <-> fk)) client
INNER JOIN (
dbo.ACCOUNTS account
INNER JOIN ACCOUNT_TYPES accountType ON (account_type)
LEFT JOIN DEDICATED_ACCOUNTS dedicated ON (account_number)
)
ON (possibly anything...)
OR (possibly the account tag...)
OR (possibly the alias...) → All Depending on the accountType
Alias RecType Mkt Description
ACMC M ca ACME Canada.
ACME M us ACME Corp.
ACMI M eu ACME International Corp.
FNF S us Frin and Flyn Association
FNJ S us
Krueger and Voorhees
Alliance
Alias Code Perm
ACME INC T
ACMI INC T
ACMC INC T
ALIAS FK Account Tag
YOGL 1 YOG
FNF 2 SID
FNJ 3 FF
ID PERM DESCRIPTION
1 S Y.G. Schwartz Supplies Procurement
2 T Frin and Flyn Procurement
3 H Special Individuals Fulfillment
4 H Special Individuals Fulfillment International
Alias Code Perm Tag
ACME INC T
ACMI INC T
ACMC INC T
YOGL S S YOG
FNF T T SID
FNJ H H FF
16. SELECT DISTINCT
account.name, alias,
CASE (...) AS OFFICIAL_IDENTITY,
CASE (...)
FROM (...) client
INNER JOIN (
dbo.ACCOUNTS account
INNER JOIN ACCOUNT_TYPES accountType ON (account_type)
LEFT JOIN DEDICATED_ACCOUNTS dedicated ON (account_number)
)
ON (accountType.mapping_type = 0)
OR (possibly the account tag...)
OR (possibly the alias...)
name alias OFFICIAL_IDENTITY perm
TUNV FNF 111 ENH
TUNV ACME 111AC ENH
SIADV FNF 456 ENH
AUNV FNF 222 ENH
AUNV ACME 222AC ENH
ACMEINV ACME 808AC ENH
YOGADV YOGL 123 ST
TUNV YOGL 111 ST
AUNV YOGL 222 ST
17. SELECT DISTINCT
account.name, alias,
CASE (...) AS OFFICIAL_IDENTITY,
CASE (...)
FROM (...) client
INNER JOIN (
dbo.ACCOUNTS account
INNER JOIN ACCOUNT_TYPES accountType ON (account_type)
LEFT JOIN DEDICATED_ACCOUNTS dedicated ON (account_number)
)
ON (possibly anything...)
OR (accountType.mapping_type = 2 AND account.tag = client.account_tag)
OR (possibly the alias...)
name alias OFFICIAL_IDENTITY perm
TUNV FNF 111 ENH
TUNV ACME 111AC ENH
SIADV FNF 456 ENH
AUNV FNF 222 ENH
AUNV ACME 222AC ENH
ACMEINV ACME 808AC ENH
YOGADV YOGL 123 ST
TUNV YOGL 111 ST
AUNV YOGL 222 ST
18. SELECT DISTINCT
account.name, alias,
CASE (...) AS OFFICIAL_IDENTITY,
CASE (...)
FROM (...) client
INNER JOIN (
dbo.ACCOUNTS account
INNER JOIN ACCOUNT_TYPES accountType ON (account_type)
LEFT JOIN DEDICATED_ACCOUNTS dedicated ON (account_number)
)
ON (possibly anything...)
OR (possibly the account tag...)
OR (accountType.mapping_type = 1 AND dedicated.client_alias = client.alias)
name alias OFFICIAL_IDENTITY perm
TUNV FNF 111 ENH
TUNV ACME 111AC ENH
SIADV FNF 456 ENH
AUNV FNF 222 ENH
AUNV ACME 222AC ENH
ACMEINV ACME 808AC ENH
YOGADV YOGL 123 ST
TUNV YOGL 111 ST
AUNV YOGL 222 ST
20. SELECT DISTINCT
account.name, alias,
CASE WHEN code = 'EV'
THEN cast(account.number AS VARCHAR)
ELSE cast(account.number AS VARCHAR) + substring(alias, 1, 2) END AS OFFICIAL_IDENTITY,
CASE WHEN order_permission IN ('A', 'S')
THEN 'ST' ELSE 'ENH' END
FROM (
SELECT DISTINCT mc.alias, mc.code, order_permission, mc.account_tag
FROM MERCHANT_CLIENTS mc
JOIN REGISTRY r ON r.alias = mc.alias
WHERE r.market = 'us' AND r.record_type = 'M'
UNION ALL
SELECT DISTINCT sc.alias, 'EV' AS code, part.order_permission, sc.account_tag
FROM SERVICE_CLIENTS sc
JOIN REGISTRY r ON r.alias = sc.alias AND r.record_type = 'S' AND r.market = 'us'
JOIN PARTNERSHIPS part ON part.id = sc.partnership_fk) client
INNER JOIN (
dbo.ACCOUNTS account
INNER JOIN ACCOUNT_TYPES accountType ON account.type = accountType.account_type
LEFT JOIN DEDICATED_ACCOUNTS dedicated ON dedicated.account_number = account.number)
ON (accountType.mapping_type = 0)
OR (accountType.mapping_type = 2 AND account.tag = client.account_tag)
OR (accountType.mapping_type = 1 AND dedicated.client_alias = client.alias)
21. WITH merchantClients AS (
SELECT DISTINCT mc.alias, mc.code, order_permission, mc.account_tag
FROM MERCHANT_CLIENTS mc
JOIN REGISTRY r ON r.alias = mc.alias),
serviceClients AS (SELECT DISTINCT
sc.alias, 'EV' AS code, partnership.order_permission, sc.account_tag
FROM SERVICE_CLIENTS sc
JOIN REGISTRY r ON r.alias = sc.alias AND r.record_type = 'S' AND r.market = 'us'
JOIN PARTNERSHIPS partnership ON partnership.id = sc.partnership_fk),
client AS (SELECT * FROM merchantClients UNION ALL SELECT * FROM serviceClients)
SELECT DISTINCT account.name, alias,
CASE WHEN code = 'EV'
THEN cast(account.number AS VARCHAR)
ELSE cast(account.number AS VARCHAR) + substring(alias, 1, 2) END AS OFFICIAL_IDENTITY,
CASE WHEN order_permission IN ('A', 'S')
THEN 'ST' ELSE 'ENH' END
FROM client
INNER JOIN (
dbo.ACCOUNTS account
INNER JOIN ACCOUNT_TYPES accountType ON account.type = accountType.account_type
LEFT JOIN DEDICATED_ACCOUNTS dedicated ON dedicated.account_number = account.number)
ON (accountType.mapping_type = 0)
OR (accountType.mapping_type = 2 AND account.tag = client.account_tag)
OR (accountType.mapping_type = 1 AND dedicated.client_alias = client.alias)
22. CREATE VIEW MERCHANT_CLIENTS_V AS
SELECT DISTINCT
mc.alias,
mc.code,
order_permission,
mc.account_tag
FROM MERCHANT_CLIENTS mc
JOIN REGISTRY entry ON entry.alias = mc.alias
WHERE entry.market = 'us'
AND entry.record_type = 'M'
CREATE VIEW SERVICE_CLIENTS_V AS
SELECT DISTINCT
sc.alias,
'EV' AS code,
partnership.order_permission,
sc.account_tag
FROM SERVICE_CLIENTS sc
JOIN REGISTRY entry ON entry.alias = sc.alias
AND entry.record_type = 'S'
AND entry.market = 'us'
JOIN PARTNERSHIPS partnership
ON partnership.id = sc.partnership_fk
CREATE VIEW CLIENTS AS
SELECT * FROM MERCHANT_CLIENTS_V
UNION ALL SELECT * FROM SERVICE_CLIENTS_V
23. CREATE VIEW MERCHANT_CLIENTS_V AS
SELECT DISTINCT (...)
FROM MERCHANT_CLIENTS mc
JOIN REGISTRY entry ON entry.alias = mc.alias
WHERE entry.market = 'us'
AND entry.record_type = 'M'
CREATE VIEW SERVICE_CLIENTS_V AS
SELECT DISTINCT (...)
FROM SERVICE_CLIENTS sc
JOIN REGISTRY entry ON entry.alias = sc.alias
AND entry.record_type = 'S'
AND entry.market = 'us'
JOIN PARTNERSHIPS partnership
ON partnership.id = sc.partnership_fk
CREATE VIEW CLIENT_ACCOUNTS AS
SELECT DISTINCT
account.name, alias,
CASE WHEN code = 'EV'
THEN cast(account.number AS VARCHAR)
ELSE cast(account.number AS VARCHAR) + substring(alias, 1, 2) END AS OFFICIAL_IDENTITY,
CASE WHEN order_permission IN ('A', 'S')
THEN 'ST' ELSE 'ENH' END
FROM CLIENTS AS client
INNER JOIN (
dbo.ACCOUNTS account
INNER JOIN ACCOUNT_TYPES accountType ON account.type = accountType.account_type
LEFT JOIN DEDICATED_ACCOUNTS dedicated ON dedicated.account_number = account.number)
ON (accountType.mapping_type = 0)
OR (accountType.mapping_type = 2 AND account.tag = client.account_tag)
OR (accountType.mapping_type = 1 AND dedicated.client_alias = client.alias)
CREATE VIEW CLIENTS AS
SELECT * FROM MERCHANT_CLIENTS_V
UNION ALL SELECT * FROM SERVICE_CLIENTS_V
24. New Requirements
1.New European Business Unit
with Client Codes from
the Partnership
2.New Canadian Business Unit
without Service Clients
25. CREATE VIEW EU_MERCHANT_CLIENTS AS
SELECT DISTINCT (...)
FROM MERCHANT_CLIENTS mc
JOIN REGISTRY entry ON entry.alias = mc.alias
WHERE entry.market = 'eu'
AND entry.record_type = 'M'
CREATE VIEW EU_SERVICE_CLIENTS AS
SELECT DISTINCT (... pc.code, ...)
FROM SERVICE_CLIENTS sc
JOIN REGISTRY entry ON entry.alias = sc.alias
AND entry.record_type = 'S'
AND entry.market = 'eu'
JOIN PARTNERSHIPS partnership
ON partnership.id = sc.partnership_fk
JOIN PARTNERSHIP_CODES pc
ON partnership.ID = pc.partnership_fk
CREATE VIEW EU_CLIENT_ACCOUNTS AS
SELECT DISTINCT
account.name, alias,
CASE WHEN code = 'EV'
THEN cast(account.number AS VARCHAR)
ELSE cast(account.number AS VARCHAR) + substring(alias, 1, 2) END AS OFFICIAL_IDENTITY,
CASE WHEN order_permission IN ('A', 'S')
THEN 'ST' ELSE 'ENH' END
FROM EU_CLIENTS AS client
INNER JOIN (
dbo.ACCOUNTS account
INNER JOIN ACCOUNT_TYPES accountType ON account.type = accountType.account_type
LEFT JOIN DEDICATED_ACCOUNTS dedicated ON dedicated.account_number = account.number)
ON (accountType.mapping_type = 0)
OR (accountType.mapping_type = 2 AND account.tag = client.account_tag)
OR (accountType.mapping_type = 1 AND dedicated.client_alias = client.alias)
CREATE VIEW EU_CLIENTS AS
SELECT * FROM EU_MERCHANT_CLIENTS
UNION ALL SELECT * FROM US_SERVICE_CLIENTS
26. CREATE VIEW CA_MERCHANT_CLIENTS AS
SELECT DISTINCT (...)
FROM MERCHANT_CLIENTS mc
JOIN REGISTRY entry ON entry.alias = mc.alias
WHERE entry.market = 'ca'
AND entry.record_type = 'M'
CREATE VIEW CA_CLIENT_ACCOUNTS AS
SELECT DISTINCT
account.name, alias,
CASE WHEN code = 'EV'
THEN cast(account.number AS VARCHAR)
ELSE cast(account.number AS VARCHAR) + substring(alias, 1, 2) END AS OFFICIAL_IDENTITY,
CASE WHEN order_permission IN ('A', 'S')
THEN 'ST' ELSE 'ENH' END
FROM CA_MERCHANT_CLIENTS AS client
INNER JOIN (
dbo.ACCOUNTS account
INNER JOIN ACCOUNT_TYPES accountType ON account.type = accountType.account_type
LEFT JOIN DEDICATED_ACCOUNTS dedicated ON dedicated.account_number = account.number)
ON (accountType.mapping_type = 0)
OR (accountType.mapping_type = 2 AND account.tag = client.account_tag)
OR (accountType.mapping_type = 1 AND dedicated.client_alias = client.alias)
28. CREATE FUNCTION dbo.merchantClientsUdf (@market)
RETURNS table as RETURN (
SELECT DISTINCT
alias, code, order_permission, account_tag
FROM MERCHANT_CLIENTS merchantClient
JOIN REGISTRY entry
ON entry.alias = merchantClient.alias
WHERE entry.market = @market
AND entry.record_type = 'M')
CREATE VIEW CLIENT_ACCOUNTS AS
SELECT DISTINCT
account.name, alias,
CASE WHEN code = 'EV'
THEN cast(account.number AS VARCHAR)
ELSE cast(account.number AS VARCHAR) + substring(alias, 1, 2) END AS OFFICIAL_IDENTITY,
CASE WHEN order_permission IN ('A', 'S')
THEN 'ST' ELSE 'ENH' END
FROM (select * from merchantClientsUdf ('us') union
select * from serviceClientsUdf ('us')) as client
INNER JOIN (
dbo.ACCOUNTS account
INNER JOIN ACCOUNT_TYPES accountType ON account.type = accountType.account_type
LEFT JOIN DEDICATED_ACCOUNTS dedicated ON dedicated.account_number = account.number)
ON (accountType.mapping_type = 0)
OR (accountType.mapping_type = 2 AND account.tag = client.account_tag)
OR (accountType.mapping_type = 1 AND dedicated.client_alias = client.alias)
CREATE FUNCTION dbo.serviceClientsUdf (@market)
RETURNS table as RETURN (
SELECT DISTINCT
alias, code, order_permission, account_tag
FROM SERVICE_CLIENTS serviceClient
JOIN REGISTRY entry
ON entry.alias = serviceClient.alias
AND entry.record_type = 'S'
AND entry.market = @market
JOIN PARTNERSHIPS partnership
ON partnership.id = serviceClient.partnership_fk)
29. CREATE FUNCTION dbo.merchantClientsUdf (@market)
RETURNS table as RETURN (…)
CREATE VIEW EU_CLIENT_ACCOUNTS AS
SELECT DISTINCT
account.name, alias,
CASE WHEN code = 'EV'
THEN cast(account.number AS VARCHAR)
ELSE cast(account.number AS VARCHAR) + substring(alias, 1, 2) END AS OFFICIAL_IDENTITY,
CASE WHEN order_permission IN ('A', 'S')
THEN 'ST' ELSE 'ENH' END
FROM (select * from merchantClientsUdf ('eu') union
select * from enhancedServiceClientsUdf ('eu')) as client
INNER JOIN (
dbo.ACCOUNTS account
INNER JOIN ACCOUNT_TYPES accountType ON account.type = accountType.account_type
LEFT JOIN DEDICATED_ACCOUNTS dedicated ON dedicated.account_number = account.number)
ON (accountType.mapping_type = 0)
OR (accountType.mapping_type = 2 AND account.tag = client.account_tag)
OR (accountType.mapping_type = 1 AND dedicated.client_alias = client.alias)
CREATE FUNCTION dbo.enhancedServiceClientsUdf (@market)
RETURNS table as RETURN (
SELECT DISTINCT
alias, code, order_permission, account_tag
FROM SERVICE_CLIENTS serviceClient
JOIN REGISTRY entry
ON (... entry.market = @market ...)
JOIN PARTNERSHIPS partnership ON (…)
JOIN PARTNERSHIP_CODES pc
ON partnership.ID = pc.partnership_fk
30. CREATE FUNCTION dbo.merchantClientsUdf (@market)
RETURNS table as RETURN (…)
CREATE VIEW CA_CLIENT_ACCOUNTS AS
SELECT DISTINCT
account.name, alias,
CASE WHEN code = 'EV'
THEN cast(account.number AS VARCHAR)
ELSE cast(account.number AS VARCHAR) + substring(alias, 1, 2) END AS OFFICIAL_IDENTITY,
CASE WHEN order_permission IN ('A', 'S')
THEN 'ST' ELSE 'ENH' END
FROM (select * from merchantClientsUdf ('ca') union
select * from enhancedServiceClientsUdf ('ca')) as client
INNER JOIN (
dbo.ACCOUNTS account
INNER JOIN ACCOUNT_TYPES accountType ON account.type = accountType.account_type
LEFT JOIN DEDICATED_ACCOUNTS dedicated ON dedicated.account_number = account.number)
ON (accountType.mapping_type = 0)
OR (accountType.mapping_type = 2 AND account.tag = client.account_tag)
OR (accountType.mapping_type = 1 AND dedicated.client_alias = client.alias)
31. ~O(N)/2 Codebase Size Per N Business Units!
Tables:
• merchantClientsUdf
• serviceClientsUdf
• CLIENT_ACCOUNTS
• merchantClientsUdf
• serviceClientsUdf
• US_CLIENT_ACCOUNTS
• enhancedServiceClientsUdf +
• EU_CLIENT_ACCOUNTS +
• CA_CLIENT_ACCOUNTS +
Tables:
= (Still) Lots of Technical Debt
40. @Entity
class Registry {...}
@Entity
class MerchantClient {...}
List<MerchantClient> merchantClients = em.createQuery(
"select distinct mc from Registry r, MerchantClient mc
where r.alias = mc.alias and r.market = :market and r.recordType = 'M'"
)
List<ServiceClient> serviceClients = em.createQuery(
"select distinct u from Registry r, ServiceClient sc, Partnership a
where r.alias = mc.alias and r.market = :market and r.recordType = 'S'"
)
@Entity
class ServiceClient {...}
@Entity
class Partnership {...}
41. @Entity
class Registry {...}
@Entity
class MerchantClient {...}
List<MerchantClient> merchantClients = em.createQuery(
"select distinct mc from Registry r, MerchantClient mc
where r.alias = mc.alias and r.market = :market and r.recordType = 'M'"
)
List<ServiceClient> serviceClients = em.createQuery(
"select distinct u from Registry r, ServiceClient sc, Partnership a
where r.alias = mc.alias and r.market = :market and r.recordType = 'S'"
)
@Entity
class ServiceClient {...}
@Entity
class Partnership {...}
How Can We Compose them???
merchantClients ++ serviceClients
43. @Entity
class AccountType {...}
@Entity
class Account {...}
@Entity
class DedicatedAccount {...}
List<Accounts> allAccounts() = em.createQuery(
"select distinct a from Account a, AccountType at
where a.accountType = at.type and "
)
List<Accounts> taggedAccounts(String tag) = em.createQuery(
"select distinct a from Account a, AccountType at
where a.accountType = at.type and a.tag = :tag"
)
List<Accounts> dedicatedAccounts(String alias) = em.createQuery(
"select distinct a from Account a, AccountType at, DedicatedAccount da
where a.accountType = at.type and da.account = a.name and da.alias = :alias"
)
44. List<Pair<Client, Account>> output = new ArrayList<>()
for (MerchantClient mc : merchantClients()) {
output.addAll(Tuple.of(mc, allAccounts()))
output.addAll(Tuple.of(taggedAccounts(mc.tag))
output.addAll(Tuple.of(dedicatedAccounts(mc.alias))
}
List<Pair<Client, Account>> output = new ArrayList<>()
for (ServiceClient sc : serviceClients()) {
output.addAll(Tuple.of(allAccounts()))
output.addAll(Tuple.of(taggedAccounts(sc.tag)))
output.addAll(Tuple.of(dedicatedAccounts(sc.alias)))
}
45. select merchantClients0_.alias as subsidiary1_0_ (MORE COLUMNS) from merchantClients
merchantClinets0_
where upper(merchantClients0_.alias) like ?
select merchantClients0_.alias as subsidiary1_0_ (MORE COLUMNS) from merchantClients
merchantClinets0_
where upper(merchantClients0_.alias) like ?
select merchantClients0_.alias as subsidiary1_0_ (MORE COLUMNS) from merchantClients
merchantClinets0_
where upper(merchantClients0_.alias) like ?
select merchantClients0_.alias as subsidiary1_0_ (MORE COLUMNS) from merchantClients
merchantClinets0_
where upper(merchantClients0_.alias) like ?
select merchantClients0_.alias as subsidiary1_0_ (MORE COLUMNS) from merchantClients
merchantClinets0_
where upper(merchantClients0_.alias) like ?
select merchantClients0_.alias as subsidiary1_0_ (MORE COLUMNS) from merchantClients
merchantClinets0_
where upper(merchantClients0_.alias) like ?
select merchantClients0_.alias as subsidiary1_0_ (MORE COLUMNS) from merchantClients
merchantClinets0_
where upper(merchantClients0_.alias) like ?
select merchantClients0_.alias as subsidiary1_0_ (MORE COLUMNS) from merchantClients
merchantClinets0_
where upper(merchantClients0_.alias) like ?
46. select merchantClients0_.alias as subsidiary1_0_ (MORE COLUMNS) from merchantClients
merchantClinets0_
where upper(merchantClients0_.alias) like ?
select merchantClients0_.alias as subsidiary1_0_ (MORE COLUMNS) from merchantClients
merchantClinets0_
where upper(merchantClients0_.alias) like ?
select merchantClients0_.alias as subsidiary1_0_ (MORE COLUMNS) from merchantClients
merchantClinets0_
where upper(merchantClients0_.alias) like ?
select merchantClients0_.alias as subsidiary1_0_ (MORE COLUMNS) from merchantClients
merchantClinets0_
where upper(merchantClients0_.alias) like ?
select merchantClients0_.alias as subsidiary1_0_ (MORE COLUMNS) from merchantClients
merchantClinets0_
where upper(merchantClients0_.alias) like ?
select merchantClients0_.alias as subsidiary1_0_ (MORE COLUMNS) from merchantClients
merchantClinets0_
where upper(merchantClients0_.alias) like ?
select merchantClients0_.alias as subsidiary1_0_ (MORE COLUMNS) from merchantClients
merchantClinets0_
where upper(merchantClients0_.alias) like ?
select merchantClients0_.alias as subsidiary1_0_ (MORE COLUMNS) from merchantClients
merchantClinets0_
where upper(merchantClients0_.alias) like ?
N+1
47. Criteria Queries?
List<MerchantClient> merchantClients() = em.createQuery(
select distinct mc from Registry r, MerchantClient mc
where r.alias = mc.alias and r.market = :market and r.recordType = 'M’)
Root<MerchantClient> fromMerchantClient = query.from(MerchantClient.class);
Join<MerchantClient, Registry> registry = fromUpdates.join("alias");
List<Predicate> conditions = new ArrayList();
conditions.add(builder.equal(registry.get("market"), market));
conditions.add(builder.equal(registry.get("recordType"), "M"));
TypedQuery<Update> typedQuery = em.createQuery(query
.select(fromMerchantClient)
.where(conditions.toArray(new Predicate[] {}))
.distinct(true)
);
48. I’ll Stick with HQL Thanks
List<MerchantClient> merchantClients() = em.createQuery(
select distinct mc from Registry r, MerchantClient mc
where r.alias = mc.alias and r.market = :market and r.recordType = 'M’)
Root<MerchantClient> fromMerchantClient = query.from(MerchantClient.class);
Join<MerchantClient, Registry> registry = fromUpdates.join("alias");
List<Predicate> conditions = new ArrayList();
conditions.add(builder.equal(registry.get("market"), market));
conditions.add(builder.equal(registry.get("recordType"), "M"));
TypedQuery<Update> typedQuery = em.createQuery(query
.select(fromMerchantClient)
.where(conditions.toArray(new Predicate[] {}))
.distinct(true)
);
49. ORM does not give us
define Client = Table[alias, code, perm, tag]
It just pretends it doesn’t exist!
* https://blog.codinghorror.com/object-relational-mapping-is-the-vietnam-of-computer-science/
51. SELECT DISTINCT
account.name, alias,
CASE (...) AS OFFICIAL_IDENTITY,
CASE (...)
FROM (
SELECT DISTINCT
mc.alias, mc.code, order_permission, mc.account_tag
FROM MERCHANT_CLIENTS mc
JOIN REGISTRY r ON ((alias) AND (otherConditions))
UNION ALL
SELECT DISTINCT
sc.alias, 'EV' AS code, part.order_permission, sc.account_tag
FROM SERVICE_CLIENTS sc
JOIN REGISTRY r ON ((alias) AND (otherConditions))
JOIN PARTNERSHIPS part ON (id <-> fk)) client
INNER JOIN (
dbo.ACCOUNTS account
INNER JOIN ACCOUNT_TYPES accountType ON (account_type)
LEFT JOIN DEDICATED_ACCOUNTS dedicated ON (account_number))
ON (possibly anything...)
OR (possibly the account tag...)
OR (possibly the alias...)
52. SELECT DISTINCT
account.name, alias,
CASE (...) AS OFFICIAL_IDENTITY,
CASE (...)
FROM (
SELECT DISTINCT
mc.alias, mc.code, order_permission, mc.account_tag
FROM MERCHANT_CLIENTS mc
JOIN REGISTRY r ON ((alias) AND (otherConditions))
UNION ALL
SELECT DISTINCT
sc.alias, 'EV' AS code, part.order_permission, sc.account_tag
FROM SERVICE_CLIENTS sc
JOIN REGISTRY r ON ((alias) AND (otherConditions))
JOIN PARTNERSHIPS part ON (id <-> fk)) client
INNER JOIN (
dbo.ACCOUNTS account
INNER JOIN ACCOUNT_TYPES accountType ON (account_type)
LEFT JOIN DEDICATED_ACCOUNTS dedicated ON (account_number))
ON (possibly anything...)
OR (possibly the account tag...)
OR (possibly the alias...)
𝝀( ) →(String, String, Char, String)
𝝀( ) →(Boolean)
53. SELECT DISTINCT
account.name, alias,
CASE (...) AS OFFICIAL_IDENTITY,
CASE (...)
FROM (
SELECT DISTINCT
mc.alias, mc.code, order_permission, mc.account_tag
FROM MERCHANT_CLIENTS mc
JOIN REGISTRY r ON ((alias) AND (otherConditions))
UNION ALL
SELECT DISTINCT
sc.alias, 'EV' AS code, part.order_permission, sc.account_tag
FROM SERVICE_CLIENTS sc
JOIN REGISTRY r ON ((alias) AND (otherConditions))
JOIN PARTNERSHIPS part ON (id <-> fk)) client
INNER JOIN (
dbo.ACCOUNTS account
INNER JOIN ACCOUNT_TYPES accountType ON (account_type)
LEFT JOIN DEDICATED_ACCOUNTS dedicated ON (account_number))
ON (possibly anything...)
OR (possibly the account tag...)
OR (possibly the alias...)
𝝀( ) →(String, String, Char, String)
𝝀( ) →(Boolean)
𝝀( ) →(String, String, Char, String)
𝝀( ) →(Boolean)
𝝀( ) →(Boolean)
54. SELECT DISTINCT
account.name, alias,
CASE (...) AS OFFICIAL_IDENTITY,
CASE (...)
FROM (
SELECT DISTINCT
mc.alias, mc.code, order_permission, mc.account_tag
FROM MERCHANT_CLIENTS mc
JOIN REGISTRY r ON ((alias) AND (otherConditions))
UNION ALL
SELECT DISTINCT
sc.alias, 'EV' AS code, part.order_permission, sc.account_tag
FROM SERVICE_CLIENTS sc
JOIN REGISTRY r ON ((alias) AND (otherConditions))
JOIN PARTNERSHIPS part ON (id <-> fk)) client
INNER JOIN (
dbo.ACCOUNTS account
INNER JOIN ACCOUNT_TYPES accountType ON (account_type)
LEFT JOIN DEDICATED_ACCOUNTS dedicated ON (account_number))
ON (possibly anything...)
OR (possibly the account tag...)
OR (possibly the alias...)
𝝀( ) →(String, String, Char, String)
𝝀( ) →(Boolean)
𝝀( ) →(String, String, Char, String)
𝝀( ) →(Boolean)
𝝀( ) →(Boolean)
𝝀( ) →(String, String, Char, String)
55. SELECT DISTINCT
account.name, alias,
CASE (...) AS OFFICIAL_IDENTITY,
CASE (...)
FROM (
SELECT DISTINCT
mc.alias, mc.code, order_permission, mc.account_tag
FROM MERCHANT_CLIENTS mc
JOIN REGISTRY r ON ((alias) AND (otherConditions))
UNION ALL
SELECT DISTINCT
sc.alias, 'EV' AS code, part.order_permission, sc.account_tag
FROM SERVICE_CLIENTS sc
JOIN REGISTRY r ON ((alias) AND (otherConditions))
JOIN PARTNERSHIPS part ON (id <-> fk)) client
INNER JOIN (
dbo.ACCOUNTS account
INNER JOIN ACCOUNT_TYPES accountType ON (account_type)
LEFT JOIN DEDICATED_ACCOUNTS dedicated ON (account_number))
ON (possibly anything...)
OR (possibly the account tag...)
OR (possibly the alias...)
𝝀( ) →(String, String, Char, String)
𝝀( ) →(Boolean)
𝝀( ) →(String, String, Char, String)
𝝀( ) →(Boolean)
𝝀( ) →(Boolean)
𝝀( ) →(String, String, Char, String)
𝝀( ) →(Boolean)
𝝀( ) →(Boolean)
𝝀( ) →(Boolean)
𝝀( ) →(Boolean)
𝝀( ) →(String, String, Int, String)
𝝀( ) →(String, Int)
𝝀( ) →(Int, String)
𝝀( ) →(Boolean)
56. SELECT DISTINCT
account.name, alias,
CASE (...) AS OFFICIAL_IDENTITY,
CASE (...)
FROM (
SELECT DISTINCT
mc.alias, mc.code, order_permission, mc.account_tag
FROM MERCHANT_CLIENTS mc
JOIN REGISTRY r ON ((alias) AND (otherConditions))
UNION ALL
SELECT DISTINCT
sc.alias, 'EV' AS code, part.order_permission, sc.account_tag
FROM SERVICE_CLIENTS sc
JOIN REGISTRY r ON ((alias) AND (otherConditions))
JOIN PARTNERSHIPS part ON (id <-> fk)) client
INNER JOIN (
dbo.ACCOUNTS account
INNER JOIN ACCOUNT_TYPES accountType ON (account_type)
LEFT JOIN DEDICATED_ACCOUNTS dedicated ON (account_number))
ON (possibly anything...)
OR (possibly the account tag...)
OR (possibly the alias...)
𝝀( ) →(String, String, Char, String)
𝝀( ) →(Boolean)
𝝀( ) →(String, String, Char, String)
𝝀( ) →(Boolean)
𝝀( ) →(Boolean)
𝝀( ) →(String, String, Char, String)
𝝀( ) →(Boolean)
𝝀( ) →(Boolean)
𝝀( ) →(Boolean)
𝝀( ) →(Boolean)
𝝀( ) →(String, String, String, String)
𝝀( ) →(String, String, Int, String)
𝝀( ) →(String, Int)
𝝀( ) →(Int, String)
𝝀( ) →(Boolean)
57. SELECT DISTINCT
account.name, alias,
CASE (...) AS OFFICIAL_IDENTITY,
CASE (...)
FROM (
SELECT DISTINCT
mc.alias, mc.code, order_permission, mc.account_tag
FROM MERCHANT_CLIENTS mc
JOIN REGISTRY r ON ((alias) AND (otherConditions))
UNION ALL
SELECT DISTINCT
sc.alias, 'EV' AS code, part.order_permission, sc.account_tag
FROM SERVICE_CLIENTS sc
JOIN REGISTRY r ON ((alias) AND (otherConditions))
JOIN PARTNERSHIPS part ON (id <-> fk)) client
INNER JOIN (
dbo.ACCOUNTS account
INNER JOIN ACCOUNT_TYPES accountType ON (account_type)
LEFT JOIN DEDICATED_ACCOUNTS dedicated ON (account_number))
ON (possibly anything...)
OR (possibly the account tag...)
OR (possibly the alias...)
𝑴(String, String, Char, String)
𝝀( ) →(Boolean)
𝑴(String, String, Char, String)
𝝀( ) →(Boolean)
𝝀( ) →(Boolean)
𝑴 →(String, String, Char, String)
𝝀( ) →(Boolean)
𝝀( ) →(Boolean)
𝝀( ) →(Boolean)
𝝀( ) →(Boolean)
𝑴(String, String, String, String)
𝑴(String, String, Int, String)
𝑴(String, Int)
𝑴(Int, String)
58. SELECT DISTINCT
account.name, alias,
CASE (...) AS OFFICIAL_IDENTITY,
CASE (...)
FROM (
SELECT DISTINCT
mc.alias, mc.code, order_permission, mc.account_tag
FROM MERCHANT_CLIENTS mc
JOIN REGISTRY r ON ((alias) AND (otherConditions))
UNION ALL
SELECT DISTINCT
sc.alias, 'EV' AS code, part.order_permission, sc.account_tag
FROM SERVICE_CLIENTS sc
JOIN REGISTRY r ON ((alias) AND (otherConditions))
JOIN PARTNERSHIPS part ON (id <-> fk)) client
INNER JOIN (
dbo.ACCOUNTS account
INNER JOIN ACCOUNT_TYPES accountType ON (account_type)
LEFT JOIN DEDICATED_ACCOUNTS dedicated ON (account_number))
ON (possibly anything...)
OR (possibly the account tag...)
OR (possibly the alias...)
𝑴(String, String, Char, String)
𝝀( ) →(Boolean)
𝑴(String, String, Char, String)
𝝀( ) →(Boolean)
𝝀( ) →(Boolean)
𝑴 →(String, String, Char, String)
𝝀( ) →(Boolean)
𝝀( ) →(Boolean)
𝝀( ) →(Boolean)
𝝀( ) →(Boolean)
𝑴(String, String, String, String)
𝑴(String, String, Int, String)
𝑴(String, Int)
𝑴(Int, String)
59. SELECT DISTINCT
account.name, alias,
CASE (...) AS OFFICIAL_IDENTITY,
CASE (...)
FROM (
SELECT DISTINCT
mc.alias, mc.code, order_permission, mc.account_tag
FROM MERCHANT_CLIENTS mc
JOIN REGISTRY r ON ((alias) AND (otherConditions))
UNION ALL
SELECT DISTINCT
sc.alias, 'EV' AS code, part.order_permission, sc.account_tag
FROM SERVICE_CLIENTS sc
JOIN REGISTRY r ON ((alias) AND (otherConditions))
JOIN PARTNERSHIPS part ON (id <-> fk)) client
INNER JOIN (
dbo.ACCOUNTS account
INNER JOIN ACCOUNT_TYPES accountType ON (account_type)
LEFT JOIN DEDICATED_ACCOUNTS dedicated ON (account_number))
ON (possibly anything...)
OR (possibly the account tag...)
OR (possibly the alias...)
𝑸𝒖𝒆𝒓𝒚[Client]
𝝀( ) →(Boolean)
𝑸𝒖𝒆𝒓𝒚 [Client]
𝝀( ) →(Boolean)
𝝀( ) →(Boolean)
𝑸𝒖𝒆𝒓𝒚 [Client]
𝝀( ) →(Boolean)
𝝀( ) →(Boolean)
𝝀( ) →(Boolean)
𝝀( ) →(Boolean)
𝑸𝒖𝒆𝒓𝒚[ClientAccountMapping]
𝑸𝒖𝒆𝒓𝒚[Account]
𝑸𝒖𝒆𝒓𝒚[AccountType]
𝑸𝒖𝒆𝒓𝒚[DedicatedAccount]
60. def merchantClientsUdf(market:String):Query[(String, String, Char, String)] = {
for {
mc <- mercantClients
r <- registry
if (r.alias === mc.alias && r.market === market
&& r.recordType === 'M')
} yield (mc.alias, mc.code, mc.orderPermission, mc.accountTag)
}
SELECT DISTINCT mc.alias, mc.code, order_permission, mc.account_tag
FROM MERCHANT_CLIENTS mc
JOIN REGISTRY r ON r.alias = mc.alias
WHERE r.market = 'us' AND r.record_type = 'M'
61. def serviceClientsUdf(market:String):Query[(String, String, Char, String)] = {
for {
sc <- serviceClients
r <- registry
if (r.alias === sc.alias && r.market === market
&& r.recordType === 'S')
part <- parnerships
if (part.id === sc.partnershipFk)
} yield (sc.alias, "EV".bind.?, part.orderPermission, sc.accountTag)
}
SELECT DISTINCT sc.alias, 'EV' AS code, part.order_permission, sc.account_tag
FROM SERVICE_CLIENTS sc
JOIN REGISTRY r ON r.alias = sc.alias AND r.record_type = 'S' AND r.market = 'us'
JOIN PARTNERSHIPS part ON part.id = sc.partnership_fk) client
62. def merchantClientsUdf(market:String):Query[(String, String, Char, String)] =
for {
mc <- mercantClients
r <- registry
if (r.alias === mc.alias && r.market === market && r.recordType === 'M')
} yield (mc.alias, mc.code, mc.orderPermission, mc.accountTag)
def serviceClientsUdf(market:String):Query[(String, String, Char, String)] =
for {
sc <- serviceClients
r <- registry
if (r.alias === sc.alias && r.market === market && r.recordType === 'S')
part <- parnerships
if (part.id === sc.partnershipFk)
} yield (sc.alias, "EV".bind.?, part.orderPermission, sc.accountTag)
def clients(market:String):Query[(String, String, Char, String)]
= merchantClientsUdf(market) ++ serviceClientsUdf(market)
63. def merchantClientsUdf(market:String):Query[Client] =
for {
mc <- mercantClients
r <- registry
if (r.alias === mc.alias && r.market === market && r.recordType === 'M')
} yield Client(mc.alias, mc.code, mc.orderPermission, mc.accountTag)
def serviceClientsUdf(market:String):Query[Client] =
for {
sc <- serviceClients
r <- registry
if (r.alias === sc.alias && r.market === market && r.recordType === 'S')
part <- parnerships
if (part.id === sc.partnershipFk)
} yield Client(sc.alias, "EV".bind.?, part.orderPermission, sc.accountTag)
def clients(market:String):Query[Client]
= merchantClientsUdf(market) ++ serviceClientsUdf(market)
65. def render(
query: Query[(Client, Accounts, AccountTypes, Option[DedicatedAccounts])]) = {
for {
(client, account, accountType, dedicatedAccount) <- query
} yield (
account.name,
Case.If(client.code === "EV")
.Then(account.number.asString)
.Else(account.number.asString.substring(1,2)),
Case.If(client.permission.min.inSet(Seq('A','S'))).Then("ST").Else("ENH")
)
}
SELECT DISTINCT
account.name, alias,
CASE WHEN code = 'EV'
THEN cast(account.number AS VARCHAR)
ELSE cast(account.number AS VARCHAR) + substring(alias, 1, 2) END AS OFFICIAL_IDENTITY,
CASE WHEN order_permission IN ('A', 'S')
THEN 'ST' ELSE 'ENH' END
67. def render(
query: Query[(Client, Accounts, AccountTypes, Option[DedicatedAccounts])]) = {
for {
(client, account, accountType, dedicatedAccount) <- query
} yield (
account.name,
Case.If(client.code === "EV")
.Then(account.number.asString)
.Else(account.number.asString.substring(1,2)),
Case.If(client.permission.min.inSet(Seq('A','S'))).Then("ST").Else("ENH")
)
}
SELECT DISTINCT
account.name, alias,
CASE WHEN code = 'EV'
THEN cast(account.number AS VARCHAR)
ELSE cast(account.number AS VARCHAR) + substring(alias, 1, 2) END AS OFFICIAL_IDENTITY,
CASE WHEN order_permission IN ('A', 'S')
THEN 'ST' ELSE 'ENH' END
68. New Requirements… Re-examined
1.New European Business Unit
with Client Codes from
the Partnership
2.New Canadian Business Unit
without Service Clients
69. Can We Do Better?
def serviceClientsUdf(market:String) =
for {
sc <- serviceClients
r <- registry if (r.alias === sc.alias && r.market === market && r.recordType === 'S')
part <- parnerships if (part.id === sc.partnershipFk)
} yield (Client(sc.alias, "EV".bind.?, part.orderPermission, sc.accountTag))
def serviceClientsUdfEnhanced(market:String) =
for {
sc <- serviceClients
r <- registry if (r.alias === sc.alias && r.market === market && r.recordType === 'S')
part <- parnerships if (part.id === sc.partnershipFk)
pc <- parnershipCodes if (part.id === pc.partnershipFk)
} yield (Client(sc.alias, pc.code, part.orderPermission, sc.accountTag))
70. Here is How
def serviceClientsDual(market:String, usePartnershipCodes:Boolean) = {
val clientsAndPartnerships = for {
sc <- serviceClients
r <- registry if (r.alias === sc.alias && r.market === market && r.recordType === 'S')
part <- parnerships if (part.id === sc.partnershipFk)
} yield (sc.alias, part.orderPermission, sc.accountTag, part.id)
usePartnershipCodes match {
case true => for {
(alias, permission, tag, partnershipId) <- clientsAndPartnerships
pc <- parnershipCodes if (partnershipId === pc.partnershipFk)
} yield Client(alias, pc.code, permission, tag)
case false => for {
(alias, permission, tag, partnershipId) <- clientsAndPartnerships
} yield Client(alias, "EV".bind.?, permission, tag)
}
}
75. def filterByRegistry[E, U](q:Query[E, U, Seq],
recordType:Char, market:String)(f:(E) => Rep[String])(
implicit shape: Shape[_ <: FlatShapeLevel, E, U, E]):Query[E, U, Seq] = {
for {
record <- q
r <- registry if (f(record) === r.alias && r.recordType === recordType
&& r.market === market)
} yield (record)
}
def merchantClientsUdf(market:String) = {
for {
mc <- filterByRegistry(mercantClients, 'M', market)(_.alias.oe)
} yield (Client(mc.alias, mc.code, mc.orderPermission, mc.accountTag))
}
def serviceClientsUdf(market:String) = {
for {
sc <- filterByRegistry(serviceClients, 'M', market)(_.alias.oe)
part <- parnerships if (part.id === sc.partnershipFk)
} yield (Client(sc.alias, "EV".bind.?, part.orderPermission, sc.accountTag))
}
Better!
76. Some Caveats
• Query[(String, String, Char, String)]
• Query[(Option[String], Option[String], Option[Char], Option[String])]
• Query[(Rep[Option[String]], Rep[Option[String]], Rep[Option[Char]], Rep[Option[String]])]
• Query[(Rep[Option[String]], Rep[Option[String]], Rep[Option[Char]], Rep[Option[String]]),
(Option[String], Option[String], Option[Char], Option[String]),
Seq]
• Query[Client], Client(String, String, Char, String)
• Query[Client], Client(Option[String], Option[String], Option[Char], Option[String])
• Query[Client, ClientRow, Seq]
Client(Rep[Option[String]], Rep[Option[String]], Rep[Option[Char]], Rep[Option[String]])
ClientRow(Option[String], Option[String], Option[Char], Option[String],
Seq)
Type Inferencing mostly does this for us
77. Some Caveats
• Query[(String, String, Char, String)]
• Query[(Option[String], Option[String], Option[Char], Option[String])]
• Query[(Rep[Option[String]], Rep[Option[String]], Rep[Option[Char]], Rep[Option[String]])]
• Query[(Rep[Option[String]], Rep[Option[String]], Rep[Option[Char]], Rep[Option[String]]),
(Option[String], Option[String], Option[Char], Option[String]),
Seq]
• Query[Client], Client(String, String, Char, String)
• Query[Client], Client(Option[String], Option[String], Option[Char], Option[String])
• Query[Client, ClientRow, Seq]
Client(Rep[Option[String]], Rep[Option[String]], Rep[Option[Char]], Rep[Option[String]])
ClientRow(Option[String], Option[String], Option[Char], Option[String],
Seq)
Type Inferencing mostly does this for us
78. Some Caveats
• Query[(String, String, Char, String)]
• Query[(Option[String], Option[String], Option[Char], Option[String])]
• Query[(Rep[Option[String]], Rep[Option[String]], Rep[Option[Char]], Rep[Option[String]])]
• Query[(Rep[Option[String]], Rep[Option[String]], Rep[Option[Char]], Rep[Option[String]]),
(Option[String], Option[String], Option[Char], Option[String]),
Seq]
• Query[Client], Client(String, String, Char, String)
• Query[Client], Client(Option[String], Option[String], Option[Char], Option[String])
• Query[Client, ClientRow, Seq]
Client(Rep[Option[String]], Rep[Option[String]], Rep[Option[Char]], Rep[Option[String]])
ClientRow(Option[String], Option[String], Option[Char], Option[String],
Seq)
Type Inferencing mostly does this for us
79. Some Caveats
• Query[(String, String, Char, String)]
• Query[(Option[String], Option[String], Option[Char], Option[String])]
• Query[(Rep[Option[String]], Rep[Option[String]], Rep[Option[Char]], Rep[Option[String]])]
• Query[(Rep[Option[String]], Rep[Option[String]], Rep[Option[Char]], Rep[Option[String]]),
(Option[String], Option[String], Option[Char], Option[String]),
Seq]
• Query[Client], Client(String, String, Char, String)
• Query[Client], Client(Option[String], Option[String], Option[Char], Option[String])
• Query[Client, ClientRow, Seq]
Client(Rep[Option[String]], Rep[Option[String]], Rep[Option[Char]], Rep[Option[String]])
ClientRow(Option[String], Option[String], Option[Char], Option[String],
Seq)
Type Inferencing mostly does this for us
80. Some Caveats
• Query[(String, String, Char, String)]
• Query[(Option[String], Option[String], Option[Char], Option[String])]
• Query[(Rep[Option[String]], Rep[Option[String]], Rep[Option[Char]], Rep[Option[String]])]
• Query[(Rep[Option[String]], Rep[Option[String]], Rep[Option[Char]], Rep[Option[String]]),
(Option[String], Option[String], Option[Char], Option[String]),
Seq]
• Query[Client], Client(String, String, Char, String)
• Query[Client], Client(Option[String], Option[String], Option[Char], Option[String])
• Query[Client, ClientRow, Seq]
Client(Rep[Option[String]], Rep[Option[String]], Rep[Option[Char]], Rep[Option[String]])
ClientRow(Option[String], Option[String], Option[Char], Option[String],
Seq)
Type Inferencing mostly does this for us
81. Some Caveats
• Query[(String, String, Char, String)]
• Query[(Option[String], Option[String], Option[Char], Option[String])]
• Query[(Rep[Option[String]], Rep[Option[String]], Rep[Option[Char]], Rep[Option[String]])]
• Query[(Rep[Option[String]], Rep[Option[String]], Rep[Option[Char]], Rep[Option[String]]),
(Option[String], Option[String], Option[Char], Option[String]),
Seq]
• Query[Client], Client(String, String, Char, String)
• Query[Client], Client(Option[String], Option[String], Option[Char], Option[String])
• Query[Client, ClientRow, Seq]
Client(Rep[Option[String]], Rep[Option[String]], Rep[Option[Char]], Rep[Option[String]])
ClientRow(Option[String], Option[String], Option[Char], Option[String],
Seq)
Type Inferencing mostly does this for us
82. Some Caveats
• Query[(String, String, Char, String)]
• Query[(Option[String], Option[String], Option[Char], Option[String])]
• Query[(Rep[Option[String]], Rep[Option[String]], Rep[Option[Char]], Rep[Option[String]])]
• Query[(Rep[Option[String]], Rep[Option[String]], Rep[Option[Char]], Rep[Option[String]]),
(Option[String], Option[String], Option[Char], Option[String]),
Seq]
• Query[Client], Client(String, String, Char, String)
• Query[Client], Client(Option[String], Option[String], Option[Char], Option[String])
• Query[Client, ClientRow, Seq]
Client(Rep[Option[String]], Rep[Option[String]], Rep[Option[Char]], Rep[Option[String]])
ClientRow(Option[String], Option[String], Option[Char], Option[String],
Seq)
Type Inferencing mostly does this for us
83. Conclusions
• Scala solves Old and New Problems in great ways!
• Check out Scala’s No-ORM Frameworks:
Slick - http://slick.lightbend.com/
Quill - http://getquill.io/
Notas del editor
3
4
6
7
8
9
The RG device. YS
12
All G in K until it’s not
European service industry not necessarily EV
EU_Client_accounts almost all technical debt
EU_Client_accounts almost all technical debt
Whenever introduce new business unit, copy almost all code
EU_Client_accounts almost all technical debt, pretend inline udf exists that can return parameterized views
EU_Client_accounts almost all technical debt
EU_Client_accounts almost all technical debt
Whenever introduce new business unit, copy almost all code
Whenever introduce new business unit, copy almost all code
Whenever introduce new business unit, copy almost all code
Whenever introduce new business unit, copy almost all code
Whenever introduce new business unit, copy almost all code (i.e. codebase size increase after constant effects)
Whenever introduce new business unit, copy almost all code
Whenever introduce new business unit, copy almost all code
Lambdas in context, associative, have unit function (select of select –sto)
Lambdas in context, associative, have unit function (select of select –sto)
Lambdas in context, associative, have unit function (select of select –sto)
Lambdas in context, associative, have unit function (select of select –sto)
Lambdas in context, associative, have unit function (select of select –sto)
Lambdas in context, associative, have unit function (select of select –sto)
These-things-are-iso-morphic
Note, that union operator is possible because same type is returned
Note, that union operator is possible because same type is returned
European service industry not necessarily EV
Note, that union operator is possible because same type is returned