You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by nt...@apache.org on 2017/03/22 14:36:07 UTC
cayenne git commit: CAY-2261 Replace NamedQuery with MappedXYZ in
*datamap.vm
Repository: cayenne
Updated Branches:
refs/heads/master 9cc58c63f -> c4e8ef895
CAY-2261 Replace NamedQuery with MappedXYZ in *datamap.vm
Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo
Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/c4e8ef89
Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/c4e8ef89
Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/c4e8ef89
Branch: refs/heads/master
Commit: c4e8ef895a147614c69c6f888124cbbada1ecb9f
Parents: 9cc58c6
Author: Nikita Timofeev <st...@gmail.com>
Authored: Wed Mar 22 17:35:47 2017 +0300
Committer: Nikita Timofeev <st...@gmail.com>
Committed: Wed Mar 22 17:35:47 2017 +0300
----------------------------------------------------------------------
.../org/apache/cayenne/gen/DataMapArtifact.java | 27 +++++----
.../v1_2/client-datamap-singleclass.vm | 54 +++++++++--------
.../templates/v1_2/client-datamap-superclass.vm | 34 ++++++-----
.../templates/v1_2/datamap-singleclass.vm | 64 +++++++++++---------
.../templates/v1_2/datamap-superclass.vm | 38 ++++++------
.../apache/cayenne/query/ProcedureQuery.java | 8 +--
docs/doc/src/main/resources/RELEASE-NOTES.txt | 1 +
7 files changed, 122 insertions(+), 104 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cayenne/blob/c4e8ef89/cayenne-cgen/src/main/java/org/apache/cayenne/gen/DataMapArtifact.java
----------------------------------------------------------------------
diff --git a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/DataMapArtifact.java b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/DataMapArtifact.java
index 8e60495..937f451 100644
--- a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/DataMapArtifact.java
+++ b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/DataMapArtifact.java
@@ -38,17 +38,14 @@ public class DataMapArtifact implements Artifact {
protected DataMap dataMap;
protected Collection<QueryDescriptor> selectQueries;
- protected Collection<QueryDescriptor> sqlTemplateQueries;
- protected Collection<QueryDescriptor> procedureQueries;
- protected Collection<QueryDescriptor> ejbqlQueries;
+ protected Collection<QueryDescriptor> execQueries;
+
protected Collection<String> queryNames;
public DataMapArtifact(DataMap dataMap, Collection<QueryDescriptor> queries) {
this.dataMap = dataMap;
selectQueries = new LinkedList<>();
- sqlTemplateQueries = new LinkedList<>();
- procedureQueries = new LinkedList<>();
- ejbqlQueries = new LinkedList<>();
+ execQueries = new LinkedList<>();
queryNames = new LinkedList<>();
addQueries(queries);
}
@@ -99,14 +96,12 @@ public class DataMapArtifact implements Artifact {
case QueryDescriptor.SELECT_QUERY:
selectQueries.add(query);
break;
+ // For now put all other queries to MappedExec list.
+ // Some additional flag could be introduced to control this explicitly.
case QueryDescriptor.PROCEDURE_QUERY:
- procedureQueries.add(query);
- break;
case QueryDescriptor.SQL_TEMPLATE:
- sqlTemplateQueries.add(query);
- break;
case QueryDescriptor.EJBQL_QUERY:
- ejbqlQueries.add(query);
+ execQueries.add(query);
break;
}
@@ -119,8 +114,16 @@ public class DataMapArtifact implements Artifact {
return selectQueries;
}
+ public Collection<QueryDescriptor> getExecQueries() {
+ return execQueries;
+ }
+
public boolean hasSelectQueries() {
- return selectQueries.size() > 0;
+ return !selectQueries.isEmpty();
+ }
+
+ public boolean hasExecQueries() {
+ return !execQueries.isEmpty();
}
public boolean hasQueryNames() {
http://git-wip-us.apache.org/repos/asf/cayenne/blob/c4e8ef89/cayenne-cgen/src/main/resources/templates/v1_2/client-datamap-singleclass.vm
----------------------------------------------------------------------
diff --git a/cayenne-cgen/src/main/resources/templates/v1_2/client-datamap-singleclass.vm b/cayenne-cgen/src/main/resources/templates/v1_2/client-datamap-singleclass.vm
index d0c7f6c..a72fd39 100644
--- a/cayenne-cgen/src/main/resources/templates/v1_2/client-datamap-singleclass.vm
+++ b/cayenne-cgen/src/main/resources/templates/v1_2/client-datamap-singleclass.vm
@@ -36,16 +36,20 @@
${importUtils.setPackage($subPackageName)}##
${importUtils.addReservedType("${subPackageName}.${subClassName}")}##
${importUtils.addType("${basePackageName}.${baseClassName}")}##
-${importUtils.addType('java.util.List')}
-${importUtils.addType('java.util.Map')}
-${importUtils.addType('java.util.HashMap')}
-${importUtils.addType('org.apache.cayenne.ObjectContext')}
+${importUtils.addType('java.util.List')}##
+${importUtils.addType('org.apache.cayenne.ObjectContext')}##
+${importUtils.addType('org.apache.cayenne.query.MappedSelect')}##
#foreach( $selectQuery in ${object.SelectQueries})
${importUtils.addType(${selectQuery.Root.ClassName})}
#foreach( $parameter in ${dataMapUtils.getParameterNames(${selectQuery})})
${importUtils.addType(${dataMapUtils.getParameterType(${selectQuery}, ${parameter})})}
#end
#end
+#if($object.hasExecQueries())##
+${importUtils.addType('java.util.Map')}##
+${importUtils.addType('org.apache.cayenne.QueryResult')}##
+${importUtils.addType('org.apache.cayenne.query.MappedExec')}##
+#end##
${importUtils.generate()}
/**
@@ -62,35 +66,33 @@ public class ${subClassName} {
#end
#end
-private static ${subClassName} instance;
+ private static ${subClassName} instance;
private ${subClassName}() {}
- public ${subClassName} getInstance() {
- if( instance == null) {
- instance = new ${subClassName}();
- }
- return instance;
+ public static ${subClassName} getInstance() {
+ if (instance == null) {
+ instance = new ${subClassName}();
+ }
+ return instance;
}
#foreach( $selectQuery in ${object.SelectQueries})
- public List<${stringUtils.stripPackageName($selectQuery.Root.ClassName)}> perform${dataMapUtils.getQueryMethodName(${selectQuery})}(ObjectContext context #foreach( $parameter in ${dataMapUtils.getParameterNames(${selectQuery})}), ${stringUtils.stripPackageName(${dataMapUtils.getParameterType(${selectQuery}, ${parameter})})} ${parameter} #end) {
- #if(${dataMapUtils.hasParameters($selectQuery)})
- String[] parameters = new String[] {
- #foreach( $parameter in ${dataMapUtils.getParameterNames(${selectQuery})})
- "${parameter}",
- #end
- };
-
- Object[] values = new Object[] {
- #foreach( $parameter in ${dataMapUtils.getParameterNames(${selectQuery})})
- ${parameter},
- #end
- };
- #end
+#set($rootClass = ${stringUtils.stripPackageName($selectQuery.Root.ClassName)})
+ public List<$rootClass> perform${dataMapUtils.getQueryMethodName(${selectQuery})}(ObjectContext context#foreach( $parameter in ${dataMapUtils.getParameterNames(${selectQuery})}), ${stringUtils.stripPackageName(${dataMapUtils.getParameterType(${selectQuery}, ${parameter})})} ${parameter}#end) {
+ MappedSelect<${rootClass}> query = MappedSelect.query(${stringUtils.capitalizedAsConstant(${selectQuery.Name})}_QUERYNAME, ${rootClass}.class);
+#foreach( $parameter in ${dataMapUtils.getParameterNames(${selectQuery})})
+ query.param("${parameter}", ${parameter});
+#end
+ return query.select(context);
+ }
- NamedQuery query = new NamedQuery("${selectQuery.Name}"#if(${dataMapUtils.hasParameters($selectQuery)}), parameters, values#end);
- return context.performQuery(query);
+#end
+#foreach( $execQuery in ${object.ExecQueries})
+ public QueryResult<?> perform${dataMapUtils.getQueryMethodName(${execQuery})}(ObjectContext context, Map<String, ?> parameters) {
+ MappedExec query = MappedExec.query(${stringUtils.capitalizedAsConstant(${execQuery.Name})}_QUERYNAME).params(parameters);
+ return query.execute(context);
}
+
#end
}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/c4e8ef89/cayenne-cgen/src/main/resources/templates/v1_2/client-datamap-superclass.vm
----------------------------------------------------------------------
diff --git a/cayenne-cgen/src/main/resources/templates/v1_2/client-datamap-superclass.vm b/cayenne-cgen/src/main/resources/templates/v1_2/client-datamap-superclass.vm
index c196301..3c63a19 100644
--- a/cayenne-cgen/src/main/resources/templates/v1_2/client-datamap-superclass.vm
+++ b/cayenne-cgen/src/main/resources/templates/v1_2/client-datamap-superclass.vm
@@ -34,10 +34,10 @@
${importUtils.setPackage($superPackageName)}##
#if(${superPackageName})${importUtils.addReservedType("${superPackageName}.${superClassName}")}#end##
#if(${basePackageName})${importUtils.addType("${basePackageName}.${baseClassName}")}#end##
-#if( ${object.hasSelectQueries()} )
+#if( ${object.hasSelectQueries()} )
${importUtils.addType('java.util.List')}##
${importUtils.addType('org.apache.cayenne.ObjectContext')}##
-${importUtils.addType('org.apache.cayenne.query.NamedQuery')}##
+${importUtils.addType('org.apache.cayenne.query.MappedSelect')}##
#foreach( $selectQuery in ${object.SelectQueries})
${importUtils.addType(${selectQuery.Root.ClientClassName})}##
#foreach( $parameter in ${dataMapUtils.getParameterNames(${selectQuery})})
@@ -45,6 +45,11 @@ ${importUtils.addType(${dataMapUtils.getParameterType(${selectQuery}, ${paramete
#end
#end
#end
+#if($object.hasExecQueries())##
+${importUtils.addType('java.util.Map')}##
+${importUtils.addType('org.apache.cayenne.QueryResult')}##
+${importUtils.addType('org.apache.cayenne.query.MappedExec')}##
+#end##
${importUtils.generate()}
/**
@@ -60,24 +65,23 @@ public class ${superClassName} {
public static final String ${stringUtils.capitalizedAsConstant($qname)}_QUERYNAME = "$qname";
#end
#end
-#foreach( $selectQuery in ${object.SelectQueries})
-
- public List<${stringUtils.stripPackageName($selectQuery.Root.ClientClassName)}> perform${dataMapUtils.getQueryMethodName(${selectQuery})}(ObjectContext context #foreach( $parameter in ${dataMapUtils.getParameterNames(${selectQuery})}), ${stringUtils.stripPackageName(${dataMapUtils.getParameterType(${selectQuery}, ${parameter})})} ${parameter}#end) {
-#if(${dataMapUtils.hasParameters($selectQuery)})
- String[] parameters = {
-#foreach( $parameter in ${dataMapUtils.getParameterNames(${selectQuery})})
- "${parameter}",
-#end
- };
- Object[] values = {
+#foreach( $selectQuery in ${object.SelectQueries})
+#set($rootClass = ${stringUtils.stripPackageName($selectQuery.Root.ClassName)})
+ public List<$rootClass> perform${dataMapUtils.getQueryMethodName(${selectQuery})}(ObjectContext context#foreach( $parameter in ${dataMapUtils.getParameterNames(${selectQuery})}), ${stringUtils.stripPackageName(${dataMapUtils.getParameterType(${selectQuery}, ${parameter})})} ${parameter}#end) {
+ MappedSelect<${rootClass}> query = MappedSelect.query(${stringUtils.capitalizedAsConstant(${selectQuery.Name})}_QUERYNAME, ${rootClass}.class);
#foreach( $parameter in ${dataMapUtils.getParameterNames(${selectQuery})})
- ${parameter},
+ query.param("${parameter}", ${parameter});
#end
- };
+ return query.select(context);
+ }
#end
- return context.performQuery(new NamedQuery("${selectQuery.Name}"#if(${dataMapUtils.hasParameters($selectQuery)}), parameters, values#end));
+#foreach( $execQuery in ${object.ExecQueries})
+ public QueryResult<?> perform${dataMapUtils.getQueryMethodName(${execQuery})}(ObjectContext context, Map<String, ?> parameters) {
+ MappedExec query = MappedExec.query(${stringUtils.capitalizedAsConstant(${execQuery.Name})}_QUERYNAME).params(parameters);
+ return query.execute(context);
}
+
#end
}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/c4e8ef89/cayenne-cgen/src/main/resources/templates/v1_2/datamap-singleclass.vm
----------------------------------------------------------------------
diff --git a/cayenne-cgen/src/main/resources/templates/v1_2/datamap-singleclass.vm b/cayenne-cgen/src/main/resources/templates/v1_2/datamap-singleclass.vm
index 9ad544c..52fcf17 100644
--- a/cayenne-cgen/src/main/resources/templates/v1_2/datamap-singleclass.vm
+++ b/cayenne-cgen/src/main/resources/templates/v1_2/datamap-singleclass.vm
@@ -36,16 +36,20 @@
${importUtils.setPackage($subPackageName)}##
${importUtils.addReservedType("${subPackageName}.${subClassName}")}##
${importUtils.addType("${basePackageName}.${baseClassName}")}##
-${importUtils.addType('java.util.List')}
-${importUtils.addType('java.util.Map')}
-${importUtils.addType('java.util.HashMap')}
-${importUtils.addType('org.apache.cayenne.ObjectContext')}
+${importUtils.addType('java.util.List')}##
+${importUtils.addType('org.apache.cayenne.ObjectContext')}##
+${importUtils.addType('org.apache.cayenne.query.MappedSelect')}##
#foreach( $selectQuery in ${object.SelectQueries})
-${importUtils.addType(${selectQuery.Root.ClassName})}
+${importUtils.addType(${selectQuery.Root.ClassName})}##
#foreach( $parameter in ${dataMapUtils.getParameterNames(${selectQuery})})
-${importUtils.addType(${dataMapUtils.getParameterType(${selectQuery}, ${parameter})})}
-#end
-#end
+${importUtils.addType(${dataMapUtils.getParameterType(${selectQuery}, ${parameter})})}##
+#end##
+#end##
+#if($object.hasExecQueries())##
+${importUtils.addType('java.util.Map')}##
+${importUtils.addType('org.apache.cayenne.QueryResult')}##
+${importUtils.addType('org.apache.cayenne.query.MappedExec')}##
+#end##
${importUtils.generate()}
/**
@@ -58,7 +62,7 @@ public class ${subClassName} {
#if( ${object.hasQueryNames()})
#foreach( $qname in ${object.QueryNames})
-public static final String ${stringUtils.capitalizedAsConstant($qname)}_QUERYNAME = "$qname";
+ public static final String ${stringUtils.capitalizedAsConstant($qname)}_QUERYNAME = "$qname";
#end
#end
@@ -66,31 +70,31 @@ public static final String ${stringUtils.capitalizedAsConstant($qname)}_QUERYNAM
private ${subClassName}() {}
- public ${subClassName} getInstance() {
- if( instance == null) {
- instance = new ${subClassName}();
- }
- return instance;
+ public static ${subClassName} getInstance() {
+ if( instance == null) {
+ instance = new ${subClassName}();
+ }
+ return instance;
}
#foreach( $selectQuery in ${object.SelectQueries})
- public List<${stringUtils.stripPackageName($selectQuery.Root.ClassName)}> perform${dataMapUtils.getQueryMethodName(${selectQuery})}(ObjectContext context #foreach( $parameter in ${dataMapUtils.getParameterNames(${selectQuery})}), ${stringUtils.stripPackageName(${dataMapUtils.getParameterType(${selectQuery}, ${parameter})})} ${parameter} #end) {
- #if(${dataMapUtils.hasParameters($selectQuery)})
- String[] parameters = new String[] {
- #foreach( $parameter in ${dataMapUtils.getParameterNames(${selectQuery})})
- "${parameter}",
- #end
- };
-
- Object[] values = new Object[] {
- #foreach( $parameter in ${dataMapUtils.getParameterNames(${selectQuery})})
- ${parameter},
- #end
- };
- #end
+#if(${dataMapUtils.isValidParameterNames($selectQuery)})
+ #set($rootClass = ${stringUtils.stripPackageName($selectQuery.Root.ClassName)})
+ public List<$rootClass> perform${dataMapUtils.getQueryMethodName(${selectQuery})}(ObjectContext context#foreach( $parameter in ${dataMapUtils.getParameterNames(${selectQuery})}), ${stringUtils.stripPackageName(${dataMapUtils.getParameterType(${selectQuery}, ${parameter})})} ${parameter}#end) {
+ MappedSelect<${rootClass}> query = MappedSelect.query(${stringUtils.capitalizedAsConstant(${selectQuery.Name})}_QUERYNAME, ${rootClass}.class);
+#foreach( $parameter in ${dataMapUtils.getParameterNames(${selectQuery})})
+ query.param("${parameter}", ${parameter});
+#end
+ return query.select(context);
+ }
- NamedQuery query = new NamedQuery("${selectQuery.Name}"#if(${dataMapUtils.hasParameters($selectQuery)}), parameters, values#end);
- return context.performQuery(query);
+#end
+#end
+#foreach( $execQuery in ${object.ExecQueries})
+ public QueryResult<?> perform${dataMapUtils.getQueryMethodName(${execQuery})}(ObjectContext context, Map<String, ?> parameters) {
+ MappedExec query = MappedExec.query(${stringUtils.capitalizedAsConstant(${execQuery.Name})}_QUERYNAME).params(parameters);
+ return query.execute(context);
}
+
#end
}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/c4e8ef89/cayenne-cgen/src/main/resources/templates/v1_2/datamap-superclass.vm
----------------------------------------------------------------------
diff --git a/cayenne-cgen/src/main/resources/templates/v1_2/datamap-superclass.vm b/cayenne-cgen/src/main/resources/templates/v1_2/datamap-superclass.vm
index 51c00f3..bea1a56 100644
--- a/cayenne-cgen/src/main/resources/templates/v1_2/datamap-superclass.vm
+++ b/cayenne-cgen/src/main/resources/templates/v1_2/datamap-superclass.vm
@@ -37,16 +37,21 @@ ${importUtils.setPackage($superPackageName)}##
#if( ${object.hasSelectQueries()} )
${importUtils.addType('java.util.List')}##
${importUtils.addType('org.apache.cayenne.ObjectContext')}##
-${importUtils.addType('org.apache.cayenne.query.NamedQuery')}##
+${importUtils.addType('org.apache.cayenne.query.MappedSelect')}##
#foreach( $selectQuery in ${object.SelectQueries})
${importUtils.addType(${selectQuery.Root.ClassName})}##
#if(${dataMapUtils.isValidParameterNames($selectQuery)})
#foreach( $parameter in ${dataMapUtils.getParameterNames(${selectQuery})})
${importUtils.addType(${dataMapUtils.getParameterType(${selectQuery}, ${parameter})})}##
-#end
-#end
-#end
-#end
+#end##
+#end##
+#end##
+#end##
+#if($object.hasExecQueries())##
+${importUtils.addType('java.util.Map')}##
+${importUtils.addType('org.apache.cayenne.QueryResult')}##
+${importUtils.addType('org.apache.cayenne.query.MappedExec')}##
+#end##
${importUtils.generate()}
/**
@@ -65,23 +70,22 @@ public class ${superClassName} {
#foreach( $selectQuery in ${object.SelectQueries})
#if(${dataMapUtils.isValidParameterNames($selectQuery)})
- public List<${stringUtils.stripPackageName($selectQuery.Root.ClassName)}> perform${dataMapUtils.getQueryMethodName(${selectQuery})}(ObjectContext context #foreach( $parameter in ${dataMapUtils.getParameterNames(${selectQuery})}), ${stringUtils.stripPackageName(${dataMapUtils.getParameterType(${selectQuery}, ${parameter})})} ${parameter}#end) {
-#if(${dataMapUtils.hasParameters($selectQuery)})
- String[] parameters = {
+ #set($rootClass = ${stringUtils.stripPackageName($selectQuery.Root.ClassName)})
+ public List<$rootClass> perform${dataMapUtils.getQueryMethodName(${selectQuery})}(ObjectContext context#foreach( $parameter in ${dataMapUtils.getParameterNames(${selectQuery})}), ${stringUtils.stripPackageName(${dataMapUtils.getParameterType(${selectQuery}, ${parameter})})} ${parameter}#end) {
+ MappedSelect<${rootClass}> query = MappedSelect.query(${stringUtils.capitalizedAsConstant(${selectQuery.Name})}_QUERYNAME, ${rootClass}.class);
#foreach( $parameter in ${dataMapUtils.getParameterNames(${selectQuery})})
- "${parameter}",
+ query.param("${parameter}", ${parameter});
#end
- };
+ return query.select(context);
+ }
- Object[] values = {
-#foreach( $parameter in ${dataMapUtils.getParameterNames(${selectQuery})})
- ${parameter},
#end
- };
-
#end
- return context.performQuery(new NamedQuery("${selectQuery.Name}"#if(${dataMapUtils.hasParameters($selectQuery)}), parameters, values#end));
+#foreach( $execQuery in ${object.ExecQueries})
+ public QueryResult<?> perform${dataMapUtils.getQueryMethodName(${execQuery})}(ObjectContext context, Map<String, ?> parameters) {
+ MappedExec query = MappedExec.query(${stringUtils.capitalizedAsConstant(${execQuery.Name})}_QUERYNAME).params(parameters);
+ return query.execute(context);
}
-#end
+
#end
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cayenne/blob/c4e8ef89/cayenne-server/src/main/java/org/apache/cayenne/query/ProcedureQuery.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/query/ProcedureQuery.java b/cayenne-server/src/main/java/org/apache/cayenne/query/ProcedureQuery.java
index 1a4738f..12ac3c7 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/query/ProcedureQuery.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/query/ProcedureQuery.java
@@ -36,8 +36,9 @@ import java.util.Map;
/**
* A query based on Procedure. Can be used as a select query, or as a query of an
* arbitrary complexity, performing data modification, selecting data (possibly with
- * multiple result sets per call), returning values via OUT parameters. <h3>Execution with
- * DataContext</h3> <h4>Reading OUT parameters</h4>
+ * multiple result sets per call), returning values via OUT parameters.
+ * <h3>Execution with DataContext</h3>
+ * <h4>Reading OUT parameters</h4>
* <p>
* If a ProcedureQuery has OUT parameters, they are wrapped in a separate List in the
* query result. Such list will contain a single Map with OUT parameter values.
@@ -72,8 +73,7 @@ public class ProcedureQuery extends AbstractQuery implements ParameterizedQuery,
ProcedureQueryMetadata metaData = new ProcedureQueryMetadata();
- // TODO: ColumnDescriptor is not XMLSerializable so we can't store
- // it in a DataMap
+ // TODO: ColumnDescriptor is not XMLSerializable so we can't store it in a DataMap
/**
* @since 1.2
*/
http://git-wip-us.apache.org/repos/asf/cayenne/blob/c4e8ef89/docs/doc/src/main/resources/RELEASE-NOTES.txt
----------------------------------------------------------------------
diff --git a/docs/doc/src/main/resources/RELEASE-NOTES.txt b/docs/doc/src/main/resources/RELEASE-NOTES.txt
index 197956b..7c2cd8b 100644
--- a/docs/doc/src/main/resources/RELEASE-NOTES.txt
+++ b/docs/doc/src/main/resources/RELEASE-NOTES.txt
@@ -19,6 +19,7 @@ CAY-2258 DI: type-safe binding of List and Map
CAY-2266 Move EventBridge implementations into autoloadable modules
CAY-2267 Contribute lifecycle events listeners via DI
CAY-2259 QueryCache: support for referencing type-safe caches
+CAY-2261 Replace NamedQuery with MappedXYZ in *datamap.vm
CAY-2268 DI: Refactor ListBuilder API ambiguities for before() / after() bindings
CAY-2269 Add support for date/time components extraction in expression functions
CAY-2270 Update function support in expression parser