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 <[email protected]> Authored: Wed Mar 22 17:35:47 2017 +0300 Committer: Nikita Timofeev <[email protected]> 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
