From 11d623cb69b52cf4238159670d20e1ea1d23be6f Mon Sep 17 00:00:00 2001 From: Robin Bygrave Date: Fri, 20 May 2016 22:13:58 +1200 Subject: [PATCH] #716 - Remove createNamedQuery() and createQuery(Class beanType, String query) ... use criteria API, query beans and RawSql --- src/main/java/com/avaje/ebean/Ebean.java | 155 -------- .../java/com/avaje/ebean/EbeanServer.java | 138 ------- src/main/java/com/avaje/ebean/Model.java | 9 - .../avaje/ebean/annotation/NamedUpdate.java | 37 -- .../avaje/ebean/annotation/NamedUpdates.java | 20 -- .../com/avaje/ebeaninternal/api/SpiQuery.java | 11 - .../server/core/DefaultContainer.java | 3 +- .../server/core/DefaultServer.java | 68 +--- .../server/core/InternalConfiguration.java | 21 +- .../server/core/OrmQueryRequest.java | 8 - .../ebeaninternal/server/core/XmlConfig.java | 64 ---- .../server/core/XmlConfigLoader.java | 71 ---- .../server/deploy/BeanDescriptor.java | 33 -- .../server/deploy/BeanDescriptorManager.java | 163 +-------- .../server/deploy/DNativeQuery.java | 18 - .../server/deploy/DRawSqlColumnInfo.java | 39 -- .../server/deploy/DRawSqlMeta.java | 118 ------ .../server/deploy/DRawSqlSelect.java | 267 -------------- .../server/deploy/DRawSqlSelectBuilder.java | 339 ------------------ .../deploy/DRawSqlSelectColumnsParser.java | 230 ------------ .../server/deploy/DeployNamedQuery.java | 80 ----- .../server/deploy/DeployNamedUpdate.java | 40 --- .../server/deploy/DeployOrmXml.java | 150 -------- .../deploy/DeployPropertyParserRawSql.java | 41 --- .../server/deploy/ebeandeploy.dtd | 16 - .../deploy/meta/DeployBeanDescriptor.java | 66 +--- .../server/deploy/parse/AnnotationClass.java | 49 --- .../ebeaninternal/server/lib/util/Dnode.java | 321 ----------------- .../server/lib/util/DnodeParser.java | 200 ----------- .../server/lib/util/DnodeReader.java | 70 ---- .../ebeaninternal/server/query/CQuery.java | 7 - .../server/query/CQueryBuilder.java | 6 - .../server/query/CQueryEngine.java | 1 - .../query/RawSqlSelectClauseBuilder.java | 97 ----- .../server/querydefn/DefaultOrmQuery.java | 80 +---- .../server/querydefn/DefaultOrmUpdate.java | 15 - .../ebeaninternal/api/TDSpiEbeanServer.java | 25 -- .../server/querydefn/TestQueryLanguage.java | 2 +- .../tests/basic/TestJoinInheritance.java | 17 - .../avaje/tests/basic/TestMappedSuper.java | 21 +- .../basic/TestOrderTotalAmountReportBean.java | 28 +- .../com/avaje/tests/basic/TestQueryParse.java | 32 -- .../tests/basic/encrypt/TestEncrypt.java | 17 - .../avaje/tests/batchload/TestLazyJoin2.java | 13 - .../avaje/tests/delete/TestDeleteByQuery.java | 14 - .../inheritance/TestInheritanceJoins.java | 16 - .../query/TestInCollectionQueryPlan.java | 33 -- .../tests/query/TestMyAdHocSqlSelect.java | 7 +- .../avaje/tests/query/TestNoSpaceBracket.java | 21 -- .../query/TestQueryLimitOffsetSimple.java | 31 -- .../avaje/tests/query/TestQueryParsing.java | 69 ---- .../com/avaje/tests/query/TestSubQuery.java | 13 +- .../orderby/TestOrderByWithFunction.java | 7 - .../other/TestQueryConversationRowCount.java | 58 --- .../tests/rawsql/TestOrderReportTotal.java | 17 +- .../rawsql/named/TestRawSqlNamedQuery.java | 25 -- .../tests/text/xml/TestDnodeXmlParser.java | 26 -- .../unitinternal/TestXmlConfigLoader.java | 91 ----- 58 files changed, 56 insertions(+), 3578 deletions(-) delete mode 100644 src/main/java/com/avaje/ebean/annotation/NamedUpdate.java delete mode 100644 src/main/java/com/avaje/ebean/annotation/NamedUpdates.java delete mode 100644 src/main/java/com/avaje/ebeaninternal/server/core/XmlConfig.java delete mode 100644 src/main/java/com/avaje/ebeaninternal/server/core/XmlConfigLoader.java delete mode 100644 src/main/java/com/avaje/ebeaninternal/server/deploy/DNativeQuery.java delete mode 100644 src/main/java/com/avaje/ebeaninternal/server/deploy/DRawSqlColumnInfo.java delete mode 100644 src/main/java/com/avaje/ebeaninternal/server/deploy/DRawSqlMeta.java delete mode 100644 src/main/java/com/avaje/ebeaninternal/server/deploy/DRawSqlSelect.java delete mode 100644 src/main/java/com/avaje/ebeaninternal/server/deploy/DRawSqlSelectBuilder.java delete mode 100644 src/main/java/com/avaje/ebeaninternal/server/deploy/DRawSqlSelectColumnsParser.java delete mode 100644 src/main/java/com/avaje/ebeaninternal/server/deploy/DeployNamedQuery.java delete mode 100644 src/main/java/com/avaje/ebeaninternal/server/deploy/DeployNamedUpdate.java delete mode 100644 src/main/java/com/avaje/ebeaninternal/server/deploy/DeployOrmXml.java delete mode 100644 src/main/java/com/avaje/ebeaninternal/server/deploy/DeployPropertyParserRawSql.java delete mode 100644 src/main/java/com/avaje/ebeaninternal/server/deploy/ebeandeploy.dtd delete mode 100644 src/main/java/com/avaje/ebeaninternal/server/lib/util/Dnode.java delete mode 100644 src/main/java/com/avaje/ebeaninternal/server/lib/util/DnodeParser.java delete mode 100644 src/main/java/com/avaje/ebeaninternal/server/lib/util/DnodeReader.java delete mode 100644 src/main/java/com/avaje/ebeaninternal/server/query/RawSqlSelectClauseBuilder.java delete mode 100644 src/test/java/com/avaje/tests/basic/TestQueryParse.java delete mode 100644 src/test/java/com/avaje/tests/query/TestInCollectionQueryPlan.java delete mode 100644 src/test/java/com/avaje/tests/query/TestNoSpaceBracket.java delete mode 100644 src/test/java/com/avaje/tests/query/TestQueryLimitOffsetSimple.java delete mode 100644 src/test/java/com/avaje/tests/query/TestQueryParsing.java delete mode 100644 src/test/java/com/avaje/tests/rawsql/named/TestRawSqlNamedQuery.java delete mode 100644 src/test/java/com/avaje/tests/text/xml/TestDnodeXmlParser.java delete mode 100644 src/test/java/com/avaje/tests/unitinternal/TestXmlConfigLoader.java diff --git a/src/main/java/com/avaje/ebean/Ebean.java b/src/main/java/com/avaje/ebean/Ebean.java index bd72189b7..850ea6eed 100644 --- a/src/main/java/com/avaje/ebean/Ebean.java +++ b/src/main/java/com/avaje/ebean/Ebean.java @@ -932,19 +932,6 @@ public final class Ebean { return serverMgr.getDefaultServer().createSqlQuery(sql); } - /** - * Create a named sql query. - *

- * The query statement will be defined in a deployment orm xml file. - *

- * - * @param namedQuery - * the name of the query - */ - public static SqlQuery createNamedSqlQuery(String namedQuery) { - return serverMgr.getDefaultServer().createNamedSqlQuery(namedQuery); - } - /** * Create a sql update for executing native dml statements. *

@@ -954,10 +941,6 @@ public final class Ebean { *

* See {@link SqlUpdate} for example usage. *

- *

- * Where possible it would be expected practice to put the statement in a orm - * xml file (named update) and use {@link #createNamedSqlUpdate(String)} . - *

*/ public static SqlUpdate createSqlUpdate(String sql) { return serverMgr.getDefaultServer().createSqlUpdate(sql); @@ -972,144 +955,6 @@ public final class Ebean { return serverMgr.getDefaultServer().createCallableSql(sql); } - /** - * Create a named sql update. - *

- * The statement (an Insert Update or Delete statement) will be defined in a - * deployment orm xml file. - *

- * - *
{@code
-   *
-   *   // Use a namedQuery
-   *   UpdateSql update = Ebean.createNamedSqlUpdate("update.topic.count");
-   * 
-   *   update.setParameter("count", 1);
-   *   update.setParameter("topicId", 50);
-   * 
-   *   int modifiedCount = update.execute();
-   *
-   * }
- */ - public static SqlUpdate createNamedSqlUpdate(String namedQuery) { - return serverMgr.getDefaultServer().createNamedSqlUpdate(namedQuery); - } - - /** - * Return a named Query that will have defined fetch paths, predicates etc. - *

- * The query is created from a statement that will be defined in a deployment - * orm xml file or NamedQuery annotations. The query will typically already - * define fetch paths, predicates, order by clauses etc so often you will just - * need to bind required parameters and then execute the query. - *

- * - *
{@code
-   *
-   *   // example
-   *   Query query = Ebean.createNamedQuery(Order.class, "new.for.customer");
-   *   query.setParameter("customerId", 23);
-   *   List newOrders = query.findList();
-   *
-   * }
- * - * @param beanType - * the class of entity to be fetched - * @param namedQuery - * the name of the query - */ - public static Query createNamedQuery(Class beanType, String namedQuery) { - - return serverMgr.getDefaultServer().createNamedQuery(beanType, namedQuery); - } - - /** - * Create a query using the query language. - *

- * Note that you are allowed to add additional clauses using where() as well - * as use fetch() and setOrderBy() after the query has been created. - *

- *

- * Note that this method signature used to map to named queries and that has - * moved to {@link #createNamedQuery(Class, String)}. - *

- * - *
{@code
-   * 
-   *   String q = "find order fetch details where status = :st";
-   * 
-   *   List newOrders = Ebean.>findOrder.class, q)
-   *     .setParameter("st", Order.Status.NEW)
-   *     .findList();
-   *
-   * }
- * - * @param query - * the object query - */ - public static Query createQuery(Class beanType, String query) { - return serverMgr.getDefaultServer().createQuery(beanType, query); - } - - /** - * Create a named orm update. The update statement is specified via the - * NamedUpdate annotation. - *

- * The orm update differs from the SqlUpdate in that it uses the bean name and - * bean property names rather than table and column names. - *

- *

- * Note that named update statements can be specified in raw sql (with column - * and table names) or using bean name and bean property names. This can be - * specified with the isSql flag. - *

- *

- * Example named updates: - *

- * - *
{@code
-   *   package app.data;
-   * 
-   *   import ...
-   * 
-   *   @NamedUpdates(value = {
-   *    @NamedUpdate( name = "setTitle",
-   * 	    isSql = false,
-   * 		  notifyCache = false,
-   * 		  update = "update topic set title = :title, postCount = :postCount where id = :id"),
-   * 	  @NamedUpdate( name = "setPostCount",
-   * 		  notifyCache = false,
-   * 		  update = "update f_topic set post_count = :postCount where id = :id"),
-   * 	  @NamedUpdate( name = "incrementPostCount",
-   * 		  notifyCache = false,
-   * 		  isSql = false,
-   * 		  update = "update Topic set postCount = postCount + 1 where id = :id") })
-   *   @Entity
-   *   @Table(name = "f_topic")
-   *   public class Topic { ...
-   *
-   * }
- * - *

- * Example using a named update: - *

- * - *
{@code
-   *
-   *   Update update = Ebean.createNamedUpdate(Topic.class, "setPostCount");
-   *   update.setParameter("postCount", 10);
-   *   update.setParameter("id", 3);
-   * 
-   *   int rows = update.execute();
-   *   System.out.println("rows updated: " + rows);
-   *
-   * }
- */ - public static Update createNamedUpdate(Class beanType, String namedUpdate) { - - return serverMgr.getDefaultServer().createNamedUpdate(beanType, namedUpdate); - } - /** * Create a orm update where you will supply the insert/update or delete * statement (rather than using a named one that is already defined using the diff --git a/src/main/java/com/avaje/ebean/EbeanServer.java b/src/main/java/com/avaje/ebean/EbeanServer.java index 188670427..e5b21a1e6 100644 --- a/src/main/java/com/avaje/ebean/EbeanServer.java +++ b/src/main/java/com/avaje/ebean/EbeanServer.java @@ -179,52 +179,6 @@ public interface EbeanServer { */ CsvReader createCsvReader(Class beanType); - /** - * Return a named Query that will have defined fetch paths, predicates etc. - *

- * The query is created from a statement that will be defined in a deployment - * orm xml file or NamedQuery annotations. The query will typically already - * define fetch paths, predicates, order by clauses etc so often you will just - * need to bind required parameters and then execute the query. - *

- * - *
{@code
-   *
-   *   // example
-   *   Query query = ebeanServer.createNamedQuery(Order.class, "new.for.customer");
-   *   query.setParameter("customerId", 23);
-   *   List newOrders = query.findList();
-   *
-   * }
- */ - Query createNamedQuery(Class beanType, String namedQuery); - - /** - * Create a query using the query language. - *

- * Note that you are allowed to add additional clauses using where() as well - * as use fetch() and setOrderBy() after the query has been created. - *

- *

- * Note that this method signature used to map to named queries and that has - * moved to {@link #createNamedQuery(Class, String)}. - *

- * - *
{@code
-   *  EbeanServer ebeanServer = ... ;
-   *  String q = "find order fetch details where status = :st";
-   *  
-   *  List newOrders
-   *        = ebeanServer.createQuery(Order.class, q)
-   *             .setParameter("st", Order.Status.NEW)
-   *             .findList();
-   * }
- * - * @param query - * the object query - */ - Query createQuery(Class beanType, String query); - /** * Create a query for an entity bean and synonym for {@link #find(Class)}. * @@ -344,62 +298,6 @@ public interface EbeanServer { */ void sort(List list, String sortByClause); - /** - * Create a named orm update. The update statement is specified via the - * NamedUpdate annotation. - *

- * The orm update differs from the SqlUpdate in that it uses the bean name and - * bean property names rather than table and column names. - *

- *

- * Note that named update statements can be specified in raw sql (with column - * and table names) or using bean name and bean property names. This can be - * specified with the isSql flag. - *

- *

- * Example named updates: - *

- * - *
{@code
-   *   package app.data;
-   *
-   *   import ...
-   *
-   *   @NamedUpdates(value = {
-   *    @NamedUpdate( name = "setTitle",
-   * 	    isSql = false,
-   * 		  notifyCache = false,
-   * 		  update = "update topic set title = :title, postCount = :postCount where id = :id"),
-   * 	  @NamedUpdate( name = "setPostCount",
-   * 		  notifyCache = false,
-   * 		  update = "update f_topic set post_count = :postCount where id = :id"),
-   * 	  @NamedUpdate( name = "incrementPostCount",
-   * 		  notifyCache = false,
-   * 		  isSql = false,
-   * 		  update = "update Topic set postCount = postCount + 1 where id = :id") })
-   *   @Entity
-   *   @Table(name = "f_topic")
-   *   public class Topic { ...
-   *
-   * }
- * - *

- * Example using a named update: - *

- * - *
{@code
-   *
-   *   Update update = ebeanServer.createNamedUpdate(Topic.class, "setPostCount");
-   *   update.setParameter("postCount", 10);
-   *   update.setParameter("id", 3);
-   *
-   *   int rows = update.execute();
-   *   System.out.println("rows updated: " + rows);
-   *
-   * }
- */ - Update createNamedUpdate(Class beanType, String namedUpdate); - /** * Create a orm update where you will supply the insert/update or delete * statement (rather than using a named one that is already defined using the @@ -441,17 +339,6 @@ public interface EbeanServer { */ SqlQuery createSqlQuery(String sql); - /** - * Create a named sql query. - *

- * The query statement will be defined in a deployment orm xml file. - *

- * - * @param namedQuery - * the name of the query - */ - SqlQuery createNamedSqlQuery(String namedQuery); - /** * Create a sql update for executing native dml statements. *

@@ -461,10 +348,6 @@ public interface EbeanServer { *

* See {@link SqlUpdate} for example usage. *

- *

- * Where possible it would be expected practice to put the statement in a orm - * xml file (named update) and use {@link #createNamedSqlUpdate(String)} . - *

*/ SqlUpdate createSqlUpdate(String sql); @@ -473,27 +356,6 @@ public interface EbeanServer { */ CallableSql createCallableSql(String callableSql); - /** - * Create a named sql update. - *

- * The statement (an Insert Update or Delete statement) will be defined in a - * deployment orm xml file. - *

- * - *
{@code
-   *
-   *   // Use a namedQuery
-   *   UpdateSql update = Ebean.createNamedSqlUpdate("update.topic.count");
-   *
-   *   update.setParameter("count", 1);
-   *   update.setParameter("topicId", 50);
-   *
-   *   int modifiedCount = update.execute();
-   *
-   * }
- */ - SqlUpdate createNamedSqlUpdate(String namedQuery); - /** * Register a TransactionCallback on the currently active transaction. *

diff --git a/src/main/java/com/avaje/ebean/Model.java b/src/main/java/com/avaje/ebean/Model.java index 782cc2e34..c9cc59db9 100644 --- a/src/main/java/com/avaje/ebean/Model.java +++ b/src/main/java/com/avaje/ebean/Model.java @@ -843,15 +843,6 @@ public abstract class Model { return query().setId(id); } - /** - * Create and return a new query using the OQL. - *

- * Equivalent to {@link EbeanServer#createQuery(Class, String)} - */ - public Query setQuery(String oql) { - return db().createQuery(type, oql); - } - /** * Create and return a new query based on the RawSql. *

diff --git a/src/main/java/com/avaje/ebean/annotation/NamedUpdate.java b/src/main/java/com/avaje/ebean/annotation/NamedUpdate.java deleted file mode 100644 index 0f1a47cde..000000000 --- a/src/main/java/com/avaje/ebean/annotation/NamedUpdate.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.avaje.ebean.annotation; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * An Update statement for a particular entity bean type. - *

- * The update can either be a sql insert,update or delete statement with tables - * and columns etc or the equivalent statement but with table names and columns - * expressed as bean types and bean properties. - *

- */ -@Target({ ElementType.TYPE }) -@Retention(RetentionPolicy.RUNTIME) -public @interface NamedUpdate { - - /** - * The name of the update. - */ - String name(); - - /** - * The insert, update or delete statement. - */ - String update(); - - /** - * Set this to false if you do not want the cache to be notified. If true the - * cache will invalidate appropriate objects from the cache (after a - * successful transaction commit). - */ - boolean notifyCache() default true; - -} diff --git a/src/main/java/com/avaje/ebean/annotation/NamedUpdates.java b/src/main/java/com/avaje/ebean/annotation/NamedUpdates.java deleted file mode 100644 index 3a8992604..000000000 --- a/src/main/java/com/avaje/ebean/annotation/NamedUpdates.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.avaje.ebean.annotation; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * Holds an array of named Update statements for a particular entity bean type. - */ -@Target({ ElementType.TYPE }) -@Retention(RetentionPolicy.RUNTIME) -public @interface NamedUpdates { - - /** - * An array of named updates. - */ - NamedUpdate[] value(); - -} diff --git a/src/main/java/com/avaje/ebeaninternal/api/SpiQuery.java b/src/main/java/com/avaje/ebeaninternal/api/SpiQuery.java index 243c7eb4a..a74fcc50e 100644 --- a/src/main/java/com/avaje/ebeaninternal/api/SpiQuery.java +++ b/src/main/java/com/avaje/ebeaninternal/api/SpiQuery.java @@ -436,11 +436,6 @@ public interface SpiQuery extends Query { */ void setUsageProfiling(boolean usageProfiling); - /** - * Return the query name. - */ - String getName(); - /** * Prepare the query which prepares sub-query expressions and calculates * and returns the query plan key. @@ -464,12 +459,6 @@ public interface SpiQuery extends Query { */ HashQuery queryHash(); - /** - * Return true if this is a query based on a SqlSelect rather than - * generated. - */ - boolean isSqlSelect(); - /** * Return true if this is a RawSql query. */ diff --git a/src/main/java/com/avaje/ebeaninternal/server/core/DefaultContainer.java b/src/main/java/com/avaje/ebeaninternal/server/core/DefaultContainer.java index 284864e87..cb5839c34 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/core/DefaultContainer.java +++ b/src/main/java/com/avaje/ebeaninternal/server/core/DefaultContainer.java @@ -114,8 +114,7 @@ public class DefaultContainer implements SpiContainer { SpiBackgroundExecutor executor = createBackgroundExecutor(serverConfig); ServerCacheManager cacheManager = getCacheManager(online, serverConfig, executor); - XmlConfig xmlConfig = new XmlConfigLoader(null).load(); - InternalConfiguration c = new InternalConfiguration(xmlConfig, clusterManager, cacheManager, executor, serverConfig, bootupClasses); + InternalConfiguration c = new InternalConfiguration(clusterManager, cacheManager, executor, serverConfig, bootupClasses); DefaultServer server = new DefaultServer(c, cacheManager); diff --git a/src/main/java/com/avaje/ebeaninternal/server/core/DefaultServer.java b/src/main/java/com/avaje/ebeaninternal/server/core/DefaultServer.java index 3c346ce43..657277c48 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/core/DefaultServer.java +++ b/src/main/java/com/avaje/ebeaninternal/server/core/DefaultServer.java @@ -38,9 +38,6 @@ import com.avaje.ebeaninternal.server.core.timezone.DataTimeZone; import com.avaje.ebeaninternal.server.deploy.BeanDescriptor; import com.avaje.ebeaninternal.server.deploy.BeanDescriptorManager; import com.avaje.ebeaninternal.server.deploy.BeanProperty; -import com.avaje.ebeaninternal.server.deploy.DNativeQuery; -import com.avaje.ebeaninternal.server.deploy.DeployNamedQuery; -import com.avaje.ebeaninternal.server.deploy.DeployNamedUpdate; import com.avaje.ebeaninternal.server.deploy.InheritInfo; import com.avaje.ebeaninternal.server.el.ElFilter; import com.avaje.ebeaninternal.server.lib.ShutdownManager; @@ -851,25 +848,6 @@ public final class DefaultServer implements SpiServer, SpiEbeanServer { beanDescriptor.sort(list, sortByClause); } - public Query createQuery(Class beanType) throws PersistenceException { - return createQuery(beanType, null); - } - - public Query createNamedQuery(Class beanType, String namedQuery) throws PersistenceException { - - BeanDescriptor desc = getBeanDescriptor(beanType); - if (desc == null) { - throw new PersistenceException("Is " + beanType.getName() + " an Entity Bean? BeanDescriptor not found?"); - } - DeployNamedQuery deployQuery = desc.getNamedQuery(namedQuery); - if (deployQuery == null) { - throw new PersistenceException("named query " + namedQuery + " was not found for " + desc.getFullName()); - } - - // this will parse the query - return new DefaultOrmQuery(desc, this, expressionFactory, deployQuery); - } - @Override public Set validateQuery(Query query) { @@ -901,38 +879,12 @@ public final class DefaultServer implements SpiServer, SpiEbeanServer { return createQuery(beanType); } - public Query createQuery(Class beanType, String query) { + public Query createQuery(Class beanType) { BeanDescriptor desc = getBeanDescriptor(beanType); if (desc == null) { throw new PersistenceException(beanType.getName() + " is NOT an Entity Bean registered with this server?"); } - switch (desc.getEntityType()) { - case SQL: - if (query != null) { - throw new PersistenceException("You must used Named queries for this Entity " + desc.getFullName()); - } - // use the "default" SqlSelect - DeployNamedQuery defaultSqlSelect = desc.getNamedQuery("default"); - return new DefaultOrmQuery(desc, this, expressionFactory, defaultSqlSelect); - - default: - return new DefaultOrmQuery(desc, this, expressionFactory, query); - } - } - - public Update createNamedUpdate(Class beanType, String namedUpdate) { - BeanDescriptor desc = getBeanDescriptor(beanType); - if (desc == null) { - String m = beanType.getName() + " is NOT an Entity Bean registered with this server?"; - throw new PersistenceException(m); - } - - DeployNamedUpdate deployUpdate = desc.getNamedUpdate(namedUpdate); - if (deployUpdate == null) { - throw new PersistenceException("named update " + namedUpdate + " was not found for " + desc.getFullName()); - } - - return new DefaultOrmUpdate(beanType, this, desc.getBaseTable(), deployUpdate); + return new DefaultOrmQuery(desc, this, expressionFactory); } public Update createUpdate(Class beanType, String ormUpdate) { @@ -949,14 +901,6 @@ public final class DefaultServer implements SpiServer, SpiEbeanServer { return new DefaultRelationalQuery(this, sql); } - public SqlQuery createNamedSqlQuery(String namedQuery) { - DNativeQuery nq = beanDescriptorManager.getNativeQuery(namedQuery); - if (nq == null) { - throw new PersistenceException("SqlQuery " + namedQuery + " not found."); - } - return new DefaultRelationalQuery(this, nq.getQuery()); - } - public SqlUpdate createSqlUpdate(String sql) { return new DefaultSqlUpdate(this, sql); } @@ -965,14 +909,6 @@ public final class DefaultServer implements SpiServer, SpiEbeanServer { return new DefaultCallableSql(this, sql); } - public SqlUpdate createNamedSqlUpdate(String namedQuery) { - DNativeQuery nq = beanDescriptorManager.getNativeQuery(namedQuery); - if (nq == null) { - throw new PersistenceException("SqlUpdate " + namedQuery + " not found."); - } - return new DefaultSqlUpdate(this, nq.getQuery()); - } - public T find(Class beanType, Object uid) { return find(beanType, uid, null); diff --git a/src/main/java/com/avaje/ebeaninternal/server/core/InternalConfiguration.java b/src/main/java/com/avaje/ebeaninternal/server/core/InternalConfiguration.java index 214247867..ec0be128b 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/core/InternalConfiguration.java +++ b/src/main/java/com/avaje/ebeaninternal/server/core/InternalConfiguration.java @@ -23,17 +23,15 @@ import com.avaje.ebeaninternal.server.changelog.DefaultChangeLogPrepare; import com.avaje.ebeaninternal.server.changelog.DefaultChangeLogRegister; import com.avaje.ebeaninternal.server.cluster.ClusterManager; import com.avaje.ebeaninternal.server.core.timezone.CloneDataTimeZone; +import com.avaje.ebeaninternal.server.core.timezone.DataTimeZone; import com.avaje.ebeaninternal.server.core.timezone.NoDataTimeZone; import com.avaje.ebeaninternal.server.core.timezone.SimpleDataTimeZone; import com.avaje.ebeaninternal.server.deploy.BeanDescriptorManager; -import com.avaje.ebeaninternal.server.deploy.DeployOrmXml; import com.avaje.ebeaninternal.server.deploy.generatedproperty.GeneratedPropertyFactory; import com.avaje.ebeaninternal.server.deploy.parse.DeployCreateProperties; import com.avaje.ebeaninternal.server.deploy.parse.DeployInherit; import com.avaje.ebeaninternal.server.deploy.parse.DeployUtil; import com.avaje.ebeaninternal.server.expression.DefaultExpressionFactory; -import com.avaje.ebeaninternal.server.core.timezone.DataTimeZone; -import org.avaje.datasource.DataSourcePool; import com.avaje.ebeaninternal.server.persist.Binder; import com.avaje.ebeaninternal.server.persist.DefaultPersister; import com.avaje.ebeaninternal.server.query.CQueryEngine; @@ -56,6 +54,7 @@ import com.avaje.ebeanservice.docstore.api.DocStoreIntegration; import com.avaje.ebeanservice.docstore.api.DocStoreUpdateProcessor; import com.avaje.ebeanservice.docstore.none.NoneDocStoreFactory; import com.fasterxml.jackson.core.JsonFactory; +import org.avaje.datasource.DataSourcePool; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -79,8 +78,6 @@ public class InternalConfiguration { private final DeployInherit deployInherit; - private final DeployOrmXml deployOrmXml; - private final TypeManager typeManager; private final DataTimeZone dataTimeZone; @@ -103,8 +100,6 @@ public class InternalConfiguration { private final SpiBackgroundExecutor backgroundExecutor; - private final XmlConfig xmlConfig; - private final JsonFactory jsonFactory; private final DocStoreFactory docStoreFactory; @@ -114,13 +109,12 @@ public class InternalConfiguration { */ private final List plugins = new ArrayList(); - public InternalConfiguration(XmlConfig xmlConfig, ClusterManager clusterManager, + public InternalConfiguration(ClusterManager clusterManager, ServerCacheManager cacheManager, SpiBackgroundExecutor backgroundExecutor, ServerConfig serverConfig, BootupClasses bootupClasses) { this.docStoreFactory = initDocStoreFactory(serverConfig.service(DocStoreFactory.class)); this.jsonFactory = serverConfig.getJsonFactory(); - this.xmlConfig = xmlConfig; this.clusterManager = clusterManager; this.backgroundExecutor = backgroundExecutor; this.cacheManager = cacheManager; @@ -131,7 +125,6 @@ public class InternalConfiguration { this.expressionFactory = initExpressionFactory(serverConfig, databasePlatform); this.typeManager = new DefaultTypeManager(serverConfig, bootupClasses); - this.deployOrmXml = new DeployOrmXml(); this.deployInherit = new DeployInherit(bootupClasses); this.deployCreateProperties = new DeployCreateProperties(typeManager); @@ -264,10 +257,6 @@ public class InternalConfiguration { return new DJsonContext(server, jsonFactory, typeManager); } - public XmlConfig getXmlConfig() { - return xmlConfig; - } - public AutoTuneService createAutoTuneService(SpiEbeanServer server) { return AutoTuneServiceFactory.create(server, serverConfig); } @@ -316,10 +305,6 @@ public class InternalConfiguration { return deployInherit; } - public DeployOrmXml getDeployOrmXml() { - return deployOrmXml; - } - public DeployCreateProperties getDeployCreateProperties() { return deployCreateProperties; } diff --git a/src/main/java/com/avaje/ebeaninternal/server/core/OrmQueryRequest.java b/src/main/java/com/avaje/ebeaninternal/server/core/OrmQueryRequest.java index 428dad377..6cfc2822c 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/core/OrmQueryRequest.java +++ b/src/main/java/com/avaje/ebeaninternal/server/core/OrmQueryRequest.java @@ -174,14 +174,6 @@ public final class OrmQueryRequest extends BeanRequest implements BeanQueryRe } } - /** - * Return true if this is a query using generated sql. If false this query - * will use raw sql (Entity bean based on raw sql select). - */ - public boolean isSqlSelect() { - return query.isSqlSelect() && query.getRawSql() == null; - } - /** * Return the PersistenceContext used for this request. */ diff --git a/src/main/java/com/avaje/ebeaninternal/server/core/XmlConfig.java b/src/main/java/com/avaje/ebeaninternal/server/core/XmlConfig.java deleted file mode 100644 index 7f97c0ef3..000000000 --- a/src/main/java/com/avaje/ebeaninternal/server/core/XmlConfig.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.avaje.ebeaninternal.server.core; - -import java.util.ArrayList; -import java.util.List; - -import com.avaje.ebeaninternal.server.lib.util.Dnode; - -/** - * Holds the orm.xml and ebean-orm.xml deployment information. - * - * @author rbygrave - */ -public class XmlConfig { - - private final List ebeanOrmXml; - private final List ormXml; - private final List allXml; - - public XmlConfig(List ormXml, List ebeanOrmXml){ - this.ormXml = ormXml; - this.ebeanOrmXml = ebeanOrmXml; - this.allXml = new ArrayList(ormXml.size() + ebeanOrmXml.size()); - allXml.addAll(ormXml); - allXml.addAll(ebeanOrmXml); - } - - public List getEbeanOrmXml() { - return ebeanOrmXml; - } - - public List getOrmXml() { - return ormXml; - } - - public List find(List entityXml, String element) { - ArrayList hits = new ArrayList(); - for (int i = 0; i < entityXml.size(); i++) { - hits.addAll(entityXml.get(i).findAll(element, 1)); - } - return hits; - } - - /** - * Find the deployment xml for a given entity. - *

- * This searches all the orm.xml and ebean-orm.xml files. - *

- */ - public List findEntityXml(String className) { - - ArrayList hits = new ArrayList(2); - - for (Dnode ormXml : allXml) { - Dnode entityMappings = ormXml.find("entity-mappings"); - - List entities = entityMappings.findAll("entity", "class", className, 1); - if (entities.size() == 1) { - hits.add(entities.get(0)); - } - } - - return hits; - } -} diff --git a/src/main/java/com/avaje/ebeaninternal/server/core/XmlConfigLoader.java b/src/main/java/com/avaje/ebeaninternal/server/core/XmlConfigLoader.java deleted file mode 100644 index b5e3006f1..000000000 --- a/src/main/java/com/avaje/ebeaninternal/server/core/XmlConfigLoader.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.avaje.ebeaninternal.server.core; - -import com.avaje.ebeaninternal.server.lib.util.Dnode; -import com.avaje.ebeaninternal.server.lib.util.DnodeReader; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.IOException; -import java.io.InputStream; -import java.net.URL; -import java.util.ArrayList; -import java.util.Enumeration; -import java.util.List; - -/** - * Used to read the orm.xml and ebean-orm.xml configuration files. - * - * @author rbygrave - * @author Richard Vowles - http://plus.google.com/RichardVowles - */ -public class XmlConfigLoader { - - private static final Logger logger = LoggerFactory.getLogger(XmlConfigLoader.class); - - private final ClassLoader classLoader; - - public XmlConfigLoader(ClassLoader classLoader) { - - if (classLoader == null) { - classLoader = getClass().getClassLoader(); - } - - this.classLoader = classLoader; - } - - public XmlConfig load() { - List ormXml = search("META-INF/orm.xml"); - List ebeanOrmXml = search("META-INF/ebean-orm.xml"); - - return new XmlConfig(ormXml, ebeanOrmXml); - } - - public List search(String resourceName) { - ArrayList xmlList = new ArrayList(); - - try { - Enumeration resources = classLoader.getResources(resourceName); - - while (resources.hasMoreElements()) { - URL url = resources.nextElement(); - - InputStream is = url.openStream(); - processInputStream(xmlList, is); - is.close(); - } - } catch (IOException e) { - logger.error("Unable to find resources {}", resourceName); - } - - return xmlList; - } - - private void processInputStream(ArrayList xmlList, InputStream is) throws IOException { - - DnodeReader reader = new DnodeReader(); - Dnode xmlDoc = reader.parseXml(is); - is.close(); - - xmlList.add(xmlDoc); - } -} diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanDescriptor.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanDescriptor.java index d5c79d9e2..f08c3d3ee 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanDescriptor.java +++ b/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanDescriptor.java @@ -347,10 +347,6 @@ public class BeanDescriptor implements MetaBeanInfo, BeanType { */ private final String fullName; - private final Map namedQueries; - - private final Map namedUpdates; - /** * Flag used to determine if saves can be skipped. */ @@ -414,9 +410,6 @@ public class BeanDescriptor implements MetaBeanInfo, BeanType { this.beanType = deploy.getBeanType(); this.rootBeanType = PersistenceContextUtil.root(beanType); this.prototypeEntityBean = createPrototypeEntityBean(beanType); - - this.namedQueries = deploy.getNamedQueries(); - this.namedUpdates = deploy.getNamedUpdates(); this.inheritInfo = deploy.getInheritInfo(); @@ -703,14 +696,6 @@ public class BeanDescriptor implements MetaBeanInfo, BeanType { softDeleteByIdSql = null; softDeleteByIdInSql = null; } - - if (!isEmbedded()) { - // parse every named update up front into sql dml - for (DeployNamedUpdate namedUpdate : namedUpdates.values()) { - DeployUpdateParser parser = new DeployUpdateParser(this); - namedUpdate.initialise(parser); - } - } } /** @@ -1532,24 +1517,6 @@ public class BeanDescriptor implements MetaBeanInfo, BeanType { return idBinder.getBindValues(idValue); } - /** - * Return a named query. - */ - public DeployNamedQuery getNamedQuery(String name) { - return namedQueries.get(name); - } - - public void addNamedQuery(DeployNamedQuery deployNamedQuery) { - namedQueries.put(deployNamedQuery.getName(), deployNamedQuery); - } - - /** - * Return a named update. - */ - public DeployNamedUpdate getNamedUpdate(String name) { - return namedUpdates.get(name); - } - @Override @SuppressWarnings("unchecked") public T createBean() { diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanDescriptorManager.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanDescriptorManager.java index 75b859f29..bc2764f44 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanDescriptorManager.java +++ b/src/main/java/com/avaje/ebeaninternal/server/deploy/BeanDescriptorManager.java @@ -2,9 +2,6 @@ package com.avaje.ebeaninternal.server.deploy; import com.avaje.ebean.BackgroundExecutor; import com.avaje.ebean.Model; -import com.avaje.ebean.RawSql; -import com.avaje.ebean.RawSqlBuilder; -import com.avaje.ebeaninternal.api.ConcurrencyMode; import com.avaje.ebean.bean.BeanCollection; import com.avaje.ebean.bean.EntityBean; import com.avaje.ebean.cache.ServerCacheManager; @@ -15,20 +12,20 @@ import com.avaje.ebean.config.ServerConfig; import com.avaje.ebean.config.dbplatform.DatabasePlatform; import com.avaje.ebean.config.dbplatform.DbHistorySupport; import com.avaje.ebean.config.dbplatform.DbIdentity; -import com.avaje.ebean.config.dbplatform.PlatformIdGenerator; import com.avaje.ebean.config.dbplatform.IdType; +import com.avaje.ebean.config.dbplatform.PlatformIdGenerator; import com.avaje.ebean.event.changelog.ChangeLogFilter; import com.avaje.ebean.event.changelog.ChangeLogListener; import com.avaje.ebean.event.changelog.ChangeLogPrepare; import com.avaje.ebean.event.changelog.ChangeLogRegister; import com.avaje.ebean.plugin.BeanType; +import com.avaje.ebeaninternal.api.ConcurrencyMode; import com.avaje.ebeaninternal.api.SpiEbeanServer; import com.avaje.ebeaninternal.api.TransactionEventTable; import com.avaje.ebeaninternal.server.core.BootupClasses; import com.avaje.ebeaninternal.server.core.InternString; import com.avaje.ebeaninternal.server.core.InternalConfiguration; import com.avaje.ebeaninternal.server.core.Message; -import com.avaje.ebeaninternal.server.core.XmlConfig; import com.avaje.ebeaninternal.server.deploy.BeanDescriptor.EntityType; import com.avaje.ebeaninternal.server.deploy.id.IdBinder; import com.avaje.ebeaninternal.server.deploy.id.IdBinderEmbedded; @@ -46,8 +43,6 @@ import com.avaje.ebeaninternal.server.deploy.parse.DeployInherit; import com.avaje.ebeaninternal.server.deploy.parse.DeployUtil; import com.avaje.ebeaninternal.server.deploy.parse.ReadAnnotations; import com.avaje.ebeaninternal.server.deploy.parse.TransientProperties; -import com.avaje.ebeaninternal.server.idgen.UuidIdGenerator; -import com.avaje.ebeaninternal.server.lib.util.Dnode; import com.avaje.ebeaninternal.server.properties.BeanPropertiesReader; import com.avaje.ebeaninternal.server.properties.BeanPropertyInfo; import com.avaje.ebeaninternal.server.properties.BeanPropertyInfoFactory; @@ -109,8 +104,6 @@ public class BeanDescriptorManager implements BeanDescriptorMap { private final DeployCreateProperties createProperties; - private final DeployOrmXml deployOrmXml; - private final BeanManagerFactory beanManagerFactory; private final ServerConfig serverConfig; @@ -163,8 +156,6 @@ public class BeanDescriptorManager implements BeanDescriptorMap { private final IdBinderFactory idBinderFactory; - private final XmlConfig xmlConfig; - private final BeanLifecycleAdapterFactory beanLifecycleAdapterFactory; private final boolean eagerFetchLobs; @@ -190,7 +181,6 @@ public class BeanDescriptorManager implements BeanDescriptorMap { this.serverName = InternString.intern(serverConfig.getName()); this.cacheManager = config.getCacheManager(); this.docStoreFactory = config.getDocStoreFactory(); - this.xmlConfig = config.getXmlConfig(); this.dbSequenceBatchSize = serverConfig.getDatabaseSequenceBatchSize(); this.backgroundExecutor = config.getBackgroundExecutor(); this.dataSource = serverConfig.getDataSource(); @@ -207,7 +197,6 @@ public class BeanDescriptorManager implements BeanDescriptorMap { this.namingConvention = serverConfig.getNamingConvention(); this.dbIdentity = config.getDatabasePlatform().getDbIdentity(); this.deplyInherit = config.getDeployInherit(); - this.deployOrmXml = config.getDeployOrmXml(); this.deployUtil = config.getDeployUtil(); this.beanManagerFactory = new BeanManagerFactory(config.getDatabasePlatform()); @@ -316,10 +305,8 @@ public class BeanDescriptorManager implements BeanDescriptorMap { readEntityBeanTable(); readEntityDeploymentAssociations(); readInheritedIdGenerators(); - // creates the BeanDescriptors readEntityRelationships(); - readRawSqlQueries(); List> list = new ArrayList>(descMap.values()); Collections.sort(list, beanDescComparator); @@ -555,10 +542,6 @@ public class BeanDescriptorManager implements BeanDescriptorMap { return beanManagerMap.get(beanClassName); } - public DNativeQuery getNativeQuery(String name) { - return deployOrmXml.getNativeQuery(name); - } - /** * Create the BeanControllers, BeanFinders and BeanListeners. */ @@ -679,25 +662,6 @@ public class BeanDescriptorManager implements BeanDescriptorMap { return new BeanTable(beanTable, this); } - /** - * Parse the named Raw Sql queries using BeanDescriptor. - */ - private void readRawSqlQueries() { - - for (DeployBeanInfo info : deplyInfoMap.values()) { - - DeployBeanDescriptor deployDesc = info.getDescriptor(); - BeanDescriptor desc = getBeanDescriptor(deployDesc.getBeanType()); - - for (DRawSqlMeta rawSqlMeta : deployDesc.getRawSqlMeta()) { - if (rawSqlMeta.getQuery() != null) { - DeployNamedQuery nq = new DRawSqlSelectBuilder(namingConvention, desc, rawSqlMeta).parse(); - desc.addNamedQuery(nq); - } - } - } - } - @SuppressWarnings({"unchecked", "rawtypes"}) private void readEntityRelationships() { @@ -1148,8 +1112,6 @@ public class BeanDescriptorManager implements BeanDescriptorMap { readAnnotations.readAssociations(info, this); - readXml(desc); - if (EntityType.SQL == desc.getEntityType()) { desc.setBaseTable(null, null, null); } @@ -1271,127 +1233,6 @@ public class BeanDescriptorManager implements BeanDescriptorMap { } } - private void readXml(DeployBeanDescriptor deployDesc) { - - List eXml = xmlConfig.findEntityXml(deployDesc.getFullName()); - readXmlRawSql(deployDesc, eXml); - - Dnode entityXml = deployOrmXml.findEntityDeploymentXml(deployDesc.getFullName()); - - if (entityXml != null) { - readXmlNamedQueries(deployDesc, entityXml); - readXmlSql(deployDesc, entityXml); - } - } - - /** - * Read sql-select (FUTURE: additionally sql-insert, sql-update, sql-delete). - * If found this entity bean is based on raw sql. - */ - private void readXmlSql(DeployBeanDescriptor deployDesc, Dnode entityXml) { - - List sqlSelectList = entityXml.findAll("sql-select", entityXml.getLevel() + 1); - for (int i = 0; i < sqlSelectList.size(); i++) { - Dnode sqlSelect = sqlSelectList.get(i); - readSqlSelect(deployDesc, sqlSelect); - } - } - - private String findContent(Dnode node, String nodeName) { - Dnode found = node.find(nodeName); - if (found != null) { - return found.getNodeContent(); - } else { - return null; - } - } - - private void readSqlSelect(DeployBeanDescriptor deployDesc, Dnode sqlSelect) { - - String name = sqlSelect.getStringAttr("name", "default"); - String extend = sqlSelect.getStringAttr("extend", null); - String queryDebug = sqlSelect.getStringAttr("debug", null); - boolean debug = (queryDebug != null && queryDebug.equalsIgnoreCase("true")); - - // the raw sql select - String query = findContent(sqlSelect, "query"); - String where = findContent(sqlSelect, "where"); - String having = findContent(sqlSelect, "having"); - String columnMapping = findContent(sqlSelect, "columnMapping"); - - DRawSqlMeta m = new DRawSqlMeta(name, extend, query, debug, where, having, columnMapping); - - deployDesc.add(m); - - } - - private void readXmlRawSql(DeployBeanDescriptor deployDesc, List entityXml) { - - List rawSqlQueries = xmlConfig.find(entityXml, "raw-sql"); - for (int i = 0; i < rawSqlQueries.size(); i++) { - Dnode rawSqlDnode = rawSqlQueries.get(i); - String name = rawSqlDnode.getAttribute("name"); - if (isEmpty(name)) { - throw new IllegalStateException("raw-sql for " + deployDesc.getFullName() + " missing name attribute"); - } - Dnode queryNode = rawSqlDnode.find("query"); - if (queryNode == null) { - throw new IllegalStateException("raw-sql for " + deployDesc.getFullName() + " missing query element"); - } - String sql = queryNode.getNodeContent(); - if (isEmpty(sql)) { - throw new IllegalStateException("raw-sql for " + deployDesc.getFullName() + " has empty sql in the query element?"); - } - - List columnMappings = rawSqlDnode.findAll("columnMapping", 1); - - RawSqlBuilder rawSqlBuilder = RawSqlBuilder.parse(sql); - for (int j = 0; j < columnMappings.size(); j++) { - Dnode cm = columnMappings.get(j); - String column = cm.getAttribute("column"); - String property = cm.getAttribute("property"); - rawSqlBuilder.columnMapping(column, property); - } - RawSql rawSql = rawSqlBuilder.create(); - - DeployNamedQuery namedQuery = new DeployNamedQuery(name, rawSql); - deployDesc.add(namedQuery); - } - } - - private boolean isEmpty(String s) { - return s == null || s.trim().length() == 0; - } - - /** - * Read named queries for this bean type. - */ - private void readXmlNamedQueries(DeployBeanDescriptor deployDesc, Dnode entityXml) { - - // look for named-query... - List namedQueries = entityXml.findAll("named-query", 1); - - for (Dnode namedQueryXml : namedQueries) { - - String name = namedQueryXml.getAttribute("name"); - Dnode query = namedQueryXml.find("query"); - if (query == null) { - logger.warn("orm.xml " + deployDesc.getFullName() + " named-query missing query element?"); - - } else { - String oql = query.getNodeContent(); - // TODO: QueryHints not read from xml yet - if (name == null || oql == null) { - logger.warn("orm.xml " + deployDesc.getFullName() + " named-query has no query content?"); - } else { - // add the named query - DeployNamedQuery q = new DeployNamedQuery(name, oql, null); - deployDesc.add(q); - } - } - } - } - private BeanPropertyInfoFactory createReflectionFactory() { return new EnhanceBeanPropertyInfoFactory(); diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/DNativeQuery.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/DNativeQuery.java deleted file mode 100644 index 82f00799b..000000000 --- a/src/main/java/com/avaje/ebeaninternal/server/deploy/DNativeQuery.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.avaje.ebeaninternal.server.deploy; - -/** - * A native query defined in deployment xml. - */ -public class DNativeQuery { - - final String query; - - public DNativeQuery(String query) { - this.query = query; - } - - public String getQuery() { - return query; - } - -} diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/DRawSqlColumnInfo.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/DRawSqlColumnInfo.java deleted file mode 100644 index f83945284..000000000 --- a/src/main/java/com/avaje/ebeaninternal/server/deploy/DRawSqlColumnInfo.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.avaje.ebeaninternal.server.deploy; - -public class DRawSqlColumnInfo { - - final String name; - - final String label; - - final String propertyName; - - final boolean scalarProperty; - - public DRawSqlColumnInfo(String name, String label, String propertyName, boolean scalarProperty) { - this.name = name; - this.label = label; - this.propertyName = propertyName; - this.scalarProperty = scalarProperty; - } - - public String getName() { - return name; - } - - public String getLabel() { - return label; - } - - public String getPropertyName() { - return propertyName; - } - - public boolean isScalarProperty() { - return scalarProperty; - } - - public String toString() { - return "name:" + name + " label:" + label + " prop:" + propertyName; - } - } \ No newline at end of file diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/DRawSqlMeta.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/DRawSqlMeta.java deleted file mode 100644 index dda18d5e7..000000000 --- a/src/main/java/com/avaje/ebeaninternal/server/deploy/DRawSqlMeta.java +++ /dev/null @@ -1,118 +0,0 @@ -package com.avaje.ebeaninternal.server.deploy; - -/** - * Meta data for a sql-select object. - *

- * Created from SqlSelect annotation or xml deployment. - *

- */ -public class DRawSqlMeta { - - private String name; - private String tableAlias; - private String extend; - private String query; - private boolean debug; - private String where; - private String having; - private String columnMapping; - - public DRawSqlMeta(String name, String extend, String query, boolean debug, - String where, String having, String columnMapping) { - - this.name = name; - this.extend = extend; - this.query = query; - this.debug = debug; - this.having = having; - this.where = where; - this.columnMapping = columnMapping; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public void setTableAlias(String tableAlias) { - this.tableAlias = tableAlias; - } - - public String getTableAlias() { - return tableAlias; - } - - public String getExtend() { - return extend; - } - - public void setExtend(String extend) { - this.extend = extend; - } - - public String getQuery() { - return query; - } - - public void setQuery(String query) { - this.query = query; - } - - public boolean isDebug() { - return debug; - } - - public void setDebug(boolean debug) { - this.debug = debug; - } - - public String getWhere() { - return where; - } - - public void setWhere(String where) { - this.where = where; - } - - public String getHaving() { - return having; - } - - public void setHaving(String having) { - this.having = having; - } - - public String getColumnMapping() { - return columnMapping; - } - - public void setColumnMapping(String columnMapping) { - this.columnMapping = columnMapping; - } - - public void extend(DRawSqlMeta parentQuery){ - extendQuery(parentQuery.getQuery()); - extendColumnMapping(parentQuery.getColumnMapping()); - } - - /** - * Prepend sql from the parent query that this query 'extends'. - */ - private void extendQuery(String parentSql) { - if (query == null) { - query = parentSql; - } else { - query = parentSql + " " + query; - } - } - - private void extendColumnMapping(String parentColumnMapping) { - if (columnMapping == null){ - columnMapping = parentColumnMapping; - } - } - -} \ No newline at end of file diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/DRawSqlSelect.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/DRawSqlSelect.java deleted file mode 100644 index 09d13e7fa..000000000 --- a/src/main/java/com/avaje/ebeaninternal/server/deploy/DRawSqlSelect.java +++ /dev/null @@ -1,267 +0,0 @@ -package com.avaje.ebeaninternal.server.deploy; - -import com.avaje.ebeaninternal.server.core.OrmQueryRequest; -import com.avaje.ebeaninternal.server.query.CQueryPredicates; -import com.avaje.ebeaninternal.server.query.SqlTree; -import com.avaje.ebeaninternal.server.query.SqlTreeNode; -import com.avaje.ebeaninternal.server.query.SqlTreeNodeRoot; -import com.avaje.ebeaninternal.server.query.SqlTreeProperties; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import javax.persistence.PersistenceException; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * Represents a SqlSelect raw sql query. - */ -public class DRawSqlSelect { - - private static final Logger logger = LoggerFactory.getLogger(DRawSqlSelect.class); - - private final BeanDescriptor desc; - - private final DRawSqlColumnInfo[] selectColumns; - - private final Map columnMap; - - private final String preWhereExprSql; - - private final boolean andWhereExpr; - - private final String preHavingExprSql; - - private final boolean andHavingExpr; - - private final String orderBySql; - - private final String whereClause; - - private final String havingClause; - - private final String query; - - private final String columnMapping; - - private final String name; - - private final SqlTree sqlTree; - - private boolean withId; - - private final String tableAlias; - - public DRawSqlSelect(BeanDescriptor desc, List selectColumns, - String tableAlias, String preWhereExprSql, boolean andWhereExpr, String preHavingExprSql, - boolean andHavingExpr, String orderBySql, DRawSqlMeta meta) { - - this.desc = desc; - this.tableAlias = tableAlias; - this.selectColumns = selectColumns.toArray(new DRawSqlColumnInfo[selectColumns.size()]); - this.preHavingExprSql = preHavingExprSql; - this.preWhereExprSql = preWhereExprSql; - this.andHavingExpr = andHavingExpr; - this.andWhereExpr = andWhereExpr; - this.orderBySql = orderBySql; - this.name = meta.getName(); - this.whereClause = meta.getWhere(); - this.havingClause = meta.getHaving(); - this.query = meta.getQuery(); - this.columnMapping = meta.getColumnMapping(); - - this.sqlTree = initialise(desc); - this.columnMap = createColumnMap(this.selectColumns); - } - - private Map createColumnMap(DRawSqlColumnInfo[] selectColumns) { - - HashMap m = new HashMap(); - for (int i = 0; i < selectColumns.length; i++) { - m.put(selectColumns[i].getPropertyName(), selectColumns[i]); - } - - return m; - } - - /** - * Find foreign keys for assoc one types and build SqlTree. - */ - private SqlTree initialise(BeanDescriptor owner){ - - try { - return buildSqlTree(owner); - - } catch (Exception e){ - String m = "Bug? initialising query "+name+" on "+owner; - throw new RuntimeException(m, e); - } - } - - /** - * Return the RawSqlColumnInfo given it's logical property name. - */ - public DRawSqlColumnInfo getRawSqlColumnInfo(String propertyName){ - return columnMap.get(propertyName); - } - - public String getTableAlias() { - return tableAlias; - } - - /** - * Build the SqlTree for this query. - *

- * Most commonly this is just a simple list of properties - aka flat, but it - * could be a real object graph tree for more complex scenarios. - *

- */ - private SqlTree buildSqlTree(BeanDescriptor desc){ - - SqlTreeProperties selectProps = new SqlTreeProperties(); - - for (int i = 0; i < selectColumns.length; i++) { - - DRawSqlColumnInfo columnInfo = selectColumns[i]; - String propName = columnInfo.getPropertyName(); - BeanProperty beanProperty = desc.getBeanProperty(propName); - if (beanProperty != null) { - if (beanProperty.isId()){ - if (i > 0){ - String m = "With "+desc+" query:"+name+" the ID is not the first column in the select. It must be..."; - throw new PersistenceException(m); - } else { - withId = true; - } - } else { - selectProps.add(beanProperty); - } - - - } else { - String m = "Mapping for " + desc.getFullName(); - m += " query["+name+"] column[" + columnInfo + "] index[" + i; - m += "] not matched to bean property?"; - logger.error(m); - } - } - - SqlTreeNode sqlRoot = new SqlTreeNodeRoot(desc, selectProps, withId); - - return new SqlTree(desc.getName(), sqlRoot); - } - - /** - * Build the full SQL Select statement for the request. - */ - public String buildSql(String orderBy, CQueryPredicates predicates, OrmQueryRequest request) { - - - StringBuilder sb = new StringBuilder(); - sb.append(preWhereExprSql); - sb.append(" "); - - String dynamicWhere = null; - if (request.getQuery().getId() != null) { - // need to convert this as well. This avoids the - // assumption that id has its proper dbColumn assigned - // which may change if using multiple raw sql statements - // against the same bean. - BeanDescriptor descriptor = request.getBeanDescriptor(); - //FIXME: I think this is broken... needs to be logical - // and then parsed for RawSqlSelect... - dynamicWhere = descriptor.getIdBinderIdSql(); - } - - String dbWhere = predicates.getDbWhere(); - if (dbWhere != null && dbWhere.length() > 0) { - if (dynamicWhere == null) { - dynamicWhere = dbWhere; - } else { - dynamicWhere += " and " + dbWhere; - } - } - - if (dynamicWhere != null) { - if (andWhereExpr) { - sb.append(" and "); - } else { - sb.append(" where "); - } - sb.append(dynamicWhere); - sb.append(" "); - } - - if (preHavingExprSql != null) { - sb.append(preHavingExprSql); - sb.append(" "); - } - - String dbHaving = predicates.getDbHaving(); - - if (dbHaving != null && dbHaving.length() > 0) { - if (andHavingExpr) { - sb.append(" and "); - } else { - sb.append(" having "); - } - sb.append(dbHaving); - sb.append(" "); - } - - if (orderBy != null) { - sb.append(" order by ").append(orderBy); - } - - return sb.toString(); - } - - public String getOrderBy(CQueryPredicates predicates) { - String orderBy = predicates.getDbOrderBy(); - if (orderBy != null) { - return orderBy; - } else { - return orderBySql; - } - } - - - public String getName() { - return name; - } - - public SqlTree getSqlTree() { - return sqlTree; - } - - public String getQuery() { - return query; - } - - public String getColumnMapping() { - return columnMapping; - } - - public String getWhereClause() { - return whereClause; - } - - public String getHavingClause() { - return havingClause; - } - - public String toString() { - return Arrays.toString(selectColumns); - } - - public BeanDescriptor getBeanDescriptor() { - return desc; - } - - public DeployParser createDeployPropertyParser() { - return new DeployPropertyParserRawSql(this); - } - -} diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/DRawSqlSelectBuilder.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/DRawSqlSelectBuilder.java deleted file mode 100644 index 1490a400c..000000000 --- a/src/main/java/com/avaje/ebeaninternal/server/deploy/DRawSqlSelectBuilder.java +++ /dev/null @@ -1,339 +0,0 @@ -package com.avaje.ebeaninternal.server.deploy; - -import java.util.List; - -import com.avaje.ebean.config.NamingConvention; -import com.avaje.ebeaninternal.server.querydefn.SimpleTextParser; - -/** - * Parses sql-select queries to try and determine the location where WHERE and HAVING - * clauses can be added dynamically to the sql. - */ -public class DRawSqlSelectBuilder { - - public static final String $_AND_HAVING = "${andHaving}"; - - public static final String $_HAVING = "${having}"; - - public static final String $_AND_WHERE = "${andWhere}"; - - public static final String $_WHERE = "${where}"; - - private static final String ORDER_BY = "order by"; - - private final BeanDescriptor desc; - - private final NamingConvention namingConvention; - - private final DRawSqlMeta meta; - - private final boolean debug; - - private String sql; - - private final SimpleTextParser textParser; - - private int placeHolderWhere; - private int placeHolderAndWhere; - private int placeHolderHaving; - private int placeHolderAndHaving; - private final boolean hasPlaceHolders; - - private int selectPos = -1; - private int fromPos = -1; - private int wherePos = -1; - private int groupByPos = -1; - private int havingPos = -1; - private int orderByPos = -1; - - private boolean whereExprAnd; - private int whereExprPos = -1; - private boolean havingExprAnd; - private int havingExprPos = -1; - - private final String tableAlias; - - public DRawSqlSelectBuilder(NamingConvention namingConvention, BeanDescriptor desc, DRawSqlMeta sqlSelectMeta) { - - this.namingConvention = namingConvention; - this.desc = desc; - this.tableAlias = sqlSelectMeta.getTableAlias(); - this.meta = sqlSelectMeta; - this.debug = sqlSelectMeta.isDebug(); - this.sql = sqlSelectMeta.getQuery().trim(); - this.hasPlaceHolders = findAndRemovePlaceHolders(); - this.textParser = new SimpleTextParser(this.sql); - } - - protected NamingConvention getNamingConvention() { - return namingConvention; - } - - protected BeanDescriptor getBeanDescriptor() { - return desc; - } - - protected boolean isDebug() { - return debug; - } - - protected void debug(String msg) { - if (debug) { - System.out.println("debug> " + msg); - } - } - - public DeployNamedQuery parse() { - - if (debug) { - debug(""); - debug("Parsing sql-select in " + getErrName()); - } - - if (!hasPlaceHolders()) { - // parse the sql for the keywords... - // select, from, where, having, group by, order by - parseSqlFindKeywords(true); - } - - List selectColumns = findSelectColumns(meta.getColumnMapping()); - whereExprPos = findWhereExprPosition(); - havingExprPos = findHavingExprPosition(); - - String preWhereExprSql = removeWhitespace(findPreWhereExprSql()); - String preHavingExprSql = removeWhitespace(findPreHavingExprSql()); - - preWhereExprSql = trimSelectKeyword(preWhereExprSql); - - String orderBySql = findOrderBySql(); - - DRawSqlSelect rawSqlSelect = new DRawSqlSelect(desc, selectColumns, tableAlias, preWhereExprSql, - whereExprAnd, preHavingExprSql, havingExprAnd, orderBySql, meta); - - return new DeployNamedQuery(rawSqlSelect); - } - - /** - * Find and remove the known place holders such as ${where}. - */ - private boolean findAndRemovePlaceHolders() { - placeHolderWhere = removePlaceHolder($_WHERE); - placeHolderAndWhere = removePlaceHolder($_AND_WHERE); - placeHolderHaving = removePlaceHolder($_HAVING); - placeHolderAndHaving = removePlaceHolder($_AND_HAVING); - return hasPlaceHolders(); - } - - private int removePlaceHolder(String placeHolder) { - int pos = sql.indexOf(placeHolder); - if (pos > -1) { - int after = pos + placeHolder.length() + 1; - if (after > sql.length()) { - sql = sql.substring(0, pos); - } else { - sql = sql.substring(0, pos) + sql.substring(after); - } - } - return pos; - } - - private boolean hasPlaceHolders() { - return placeHolderWhere > -1 || placeHolderAndWhere > -1 || placeHolderHaving > -1 || placeHolderAndHaving > -1; - } - - /** - * Trim off the select keyword (to support row_number() limit function). - */ - private String trimSelectKeyword(String preWhereExprSql) { - - if (preWhereExprSql.length() < 7){ - throw new RuntimeException("Expecting at least 7 chars in ["+preWhereExprSql+"]"); - } - - String select = preWhereExprSql.substring(0, 7); - if (!select.equalsIgnoreCase("select ")){ - throw new RuntimeException("Expecting ["+preWhereExprSql+"] to start with \"select\""); - } - return preWhereExprSql.substring(7); - } - - - private String findOrderBySql() { - if (orderByPos > -1) { - int pos = orderByPos + ORDER_BY.length(); - return sql.substring(pos); - } - return null; - } - - private String findPreHavingExprSql() { - if (havingExprPos > whereExprPos) { - // an order by clause follows... - return sql.substring(whereExprPos, havingExprPos - 1); - } - if (whereExprPos > -1) { - // the rest of the sql... - return sql.substring(whereExprPos); - } - return null; - } - - private String findPreWhereExprSql() { - if (whereExprPos > -1) { - return sql.substring(0, whereExprPos - 1); - } else { - return sql; - } - } - - protected String getErrName() { - return "entity[" + desc.getFullName() + "] query[" + meta.getName() + "]"; - } - - /** - * Find the columns in the select clause including the table alias' and - * column alias. - */ - private List findSelectColumns(String selectClause) { - - if (selectClause == null || selectClause.trim().length() == 0) { - if (hasPlaceHolders) { - if (debug) { - debug("... No explicit ColumnMapping, so parse the sql looking for SELECT and FROM keywords."); - } - parseSqlFindKeywords(false); - } - if (selectPos == -1 || fromPos == -1) { - String msg = "Error in [" + getErrName() + "] parsing sql looking "; - msg += "for SELECT and FROM keywords."; - msg += " select:" + selectPos + " from:" + fromPos; - msg += ". You could use an explicit columnMapping to bypass this error."; - throw new RuntimeException(msg); - } - selectPos += "select".length(); - selectClause = sql.substring(selectPos, fromPos); - } - - selectClause = selectClause.trim(); - if (debug) { - debug("ColumnMapping ... [" + selectClause + "]"); - } - - return new DRawSqlSelectColumnsParser(this,selectClause).parse(); - } - - private void parseSqlFindKeywords(boolean allKeywords) { - - debug("Parsing query looking for SELECT..."); - selectPos = textParser.findWordLower("select"); - if (selectPos == -1) { - String msg = "Error in "+getErrName()+" parsing sql, can not find SELECT keyword in:"; - throw new RuntimeException(msg + sql); - } - debug("Parsing query looking for FROM... SELECT found at " + selectPos); - fromPos = textParser.findWordLower("from"); - if (fromPos == -1) { - String msg = "Error in "+getErrName()+" parsing sql, can not find FROM keyword in:"; - throw new RuntimeException(msg + sql); - } - - if (!allKeywords) { - return; - } - - debug("Parsing query looking for WHERE... FROM found at " + fromPos); - wherePos = textParser.findWordLower("where"); - if (wherePos == -1) { - debug("Parsing query looking for GROUP... no WHERE found"); - groupByPos = textParser.findWordLower("group", fromPos + 5); - } else { - debug("Parsing query looking for GROUP... WHERE found at " + wherePos); - groupByPos = textParser.findWordLower("group"); - } - if (groupByPos > -1) { - debug("Parsing query looking for HAVING... GROUP found at " + groupByPos); - havingPos = textParser.findWordLower("having"); - } - - int startOrderBy = havingPos; - if (startOrderBy == -1) { - startOrderBy = groupByPos; - } - if (startOrderBy == -1) { - startOrderBy = wherePos; - } - if (startOrderBy == -1) { - startOrderBy = fromPos; - } - - debug("Parsing query looking for ORDER... starting at " + startOrderBy); - orderByPos = textParser.findWordLower("order", startOrderBy); - } - - private int findWhereExprPosition() { - if (hasPlaceHolders) { - if (placeHolderWhere > -1) { - return placeHolderWhere; - } else { - whereExprAnd = true; - return placeHolderAndWhere; - } - } - whereExprAnd = wherePos > 0; - if (groupByPos > 0) { - return groupByPos; - } - if (havingPos > 0) { - return havingPos; - } - if (orderByPos > 0) { - return orderByPos; - } - return -1; - } - - private int findHavingExprPosition() { - if (hasPlaceHolders) { - if (placeHolderHaving > -1) { - return placeHolderHaving; - } else { - havingExprAnd = true; - return placeHolderAndHaving; - } - } - havingExprAnd = havingPos > 0; - if (orderByPos > 0) { - return orderByPos; - } - return -1; - } - - private String removeWhitespace(String sql) { - if (sql == null) { - return ""; - } - - boolean removeWhitespace = false; - - int length = sql.length(); - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < length; i++) { - char c = sql.charAt(i); - if (removeWhitespace) { - if (!Character.isWhitespace(c)) { - sb.append(c); - removeWhitespace = false; - } - } else { - if (c == '\r' || c == '\n') { - sb.append('\n'); - removeWhitespace = true; - } else { - sb.append(c); - } - } - } - - return sb.toString(); - } -} diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/DRawSqlSelectColumnsParser.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/DRawSqlSelectColumnsParser.java deleted file mode 100644 index f2ac09bfd..000000000 --- a/src/main/java/com/avaje/ebeaninternal/server/deploy/DRawSqlSelectColumnsParser.java +++ /dev/null @@ -1,230 +0,0 @@ -package com.avaje.ebeaninternal.server.deploy; - -import java.util.ArrayList; -import java.util.List; - -import javax.persistence.PersistenceException; - -import com.avaje.ebean.config.NamingConvention; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Parses columnMapping (select clause) mapping columns to bean properties. - */ -public final class DRawSqlSelectColumnsParser { - - private static final Logger logger = LoggerFactory.getLogger(DRawSqlSelectColumnsParser.class); - - /** - * Description of how the match was made. - */ - private String matchDescription; - - /** - * The actual column string used in search for a matching property. - *

- * This has table alias' and quoted identifiers removed. - *

- */ - private String searchColumn; - - private int columnIndex; - - private int pos; - - private final int end; - - private final String sqlSelect; - - private final List columns = new ArrayList(); - - private final BeanDescriptor desc; - - private final NamingConvention namingConvention; - - private final DRawSqlSelectBuilder parent; - - private final boolean debug; - - public DRawSqlSelectColumnsParser(DRawSqlSelectBuilder parent, String sqlSelect) { - this.parent = parent; - this.debug = parent.isDebug(); - this.namingConvention = parent.getNamingConvention(); - this.desc = parent.getBeanDescriptor(); - this.sqlSelect = sqlSelect; - this.end = sqlSelect.length(); - } - - public List parse() { - while (pos <= end) { - nextColumnInfo(); - } - return columns; - } - - private void nextColumnInfo() { - int start = pos; - nextComma(); - String colInfo = sqlSelect.substring(start, pos); - pos++; - colInfo = colInfo.trim(); - int secLastSpace = -1; - int lastSpace = colInfo.lastIndexOf(' '); - if (lastSpace > -1) { - secLastSpace = colInfo.lastIndexOf(' ', lastSpace - 1); - } - String colName; - String colLabel; - if (lastSpace == -1) { - // no column alias - colName = colInfo; - colLabel = colName; - } else if (secLastSpace == -1) { - // no 'as' keyword - colName = colInfo.substring(0, lastSpace); - colLabel = colInfo.substring(lastSpace + 1); - if (colName.equals("")) { - colName = colLabel; - } - } else { - // check for as keyword - String expectedAs = colInfo.substring(secLastSpace + 1, lastSpace); - if (expectedAs.toLowerCase().equals("as")) { - colName = colInfo.substring(0, secLastSpace); - colLabel = colInfo.substring(lastSpace + 1); - } else { - String msg = "Error in " + parent.getErrName() + ". "; - msg += "Expected \"AS\" keyword but got [" + expectedAs + "] in select clause [" - + colInfo + "]"; - throw new PersistenceException(msg); - } - } - - - BeanProperty prop = findProperty(colLabel); - if (prop == null) { - if (debug) { - String msg = "ColumnMapping ... idx[" + columnIndex - + "] ERROR, no property found to match... column[" + colName + "] label[" + colLabel - + "] search[" + searchColumn + "]"; - parent.debug(msg); - } - String msg = "Error in " + parent.getErrName() + ". "; - msg += "No matching bean property for column[" + colName + "] columnLabel[" + colLabel - + "] idx[" + columnIndex + "] using search[" + searchColumn + "] found?"; - logger.error(msg); - - } else { - - - String msg = null; - if (debug || logger.isDebugEnabled()) { - msg = "ColumnMapping ... idx[" + columnIndex + "] match column[" + colName - + "] label[" + colLabel + "] to property[" + prop + "]" - + matchDescription; - } - if (debug) { - parent.debug(msg); - } - if (logger.isDebugEnabled()) { - logger.debug(msg); - } - - DRawSqlColumnInfo info = new DRawSqlColumnInfo(colName, colLabel, prop.getName(), prop.isScalar()); - columns.add(info); - columnIndex++; - - } - } - - private String removeQuotedIdentifierChars(String columnLabel) { - - char c = columnLabel.charAt(0); - if (Character.isJavaIdentifierStart(c)) { - return columnLabel; - } - - // trim off first and last character - String result = columnLabel.substring(1, columnLabel.length() - 1); - - String msg = "sql-select trimming quoted identifier from[" - + columnLabel + "] to[" + result+ "]"; - logger.debug(msg); - - return result; - } - - /** - * Find the property to match against the given resultSet column. - */ - private BeanProperty findProperty(String column) { - - searchColumn = column; - int dotPos = searchColumn.indexOf("."); - if (dotPos > -1) { - searchColumn = searchColumn.substring(dotPos + 1); - } - - searchColumn = removeQuotedIdentifierChars(searchColumn); - - BeanProperty matchingProp = desc.getBeanProperty(searchColumn); - if (matchingProp != null) { - matchDescription = ""; - return matchingProp; - } - - // convert columnName using the namingConvention - String propertyName = namingConvention.getPropertyFromColumn(desc.getBeanType(), searchColumn); - matchingProp = desc.getBeanProperty(propertyName); - if (matchingProp != null) { - matchDescription = " ... using naming convention"; - return matchingProp; - } - - matchDescription = " ... by linear search"; - - // search all properties matching against the property db column - BeanProperty[] propertiesBase = desc.propertiesBaseScalar(); - for (int i = 0; i < propertiesBase.length; i++) { - BeanProperty prop = propertiesBase[i]; - if (isMatch(prop, searchColumn)) { - return prop; - } - } - - BeanProperty idProp = desc.getIdProperty(); - if (idProp != null) { - if (isMatch(idProp, searchColumn)) { - return idProp; - } - } - - BeanPropertyAssocOne[] propertiesAssocOne = desc.propertiesOne(); - for (int i = 0; i < propertiesAssocOne.length; i++) { - BeanProperty prop = propertiesAssocOne[i]; - if (isMatch(prop, searchColumn)) { - return prop; - } - } - - return null; - } - - private boolean isMatch(BeanProperty prop, String columnLabel) { - return columnLabel.equalsIgnoreCase(prop.getDbColumn()) || columnLabel.equalsIgnoreCase(prop.getName()); - } - - private void nextComma() { - boolean inQuote = false; - while (pos < end) { - char c = sqlSelect.charAt(pos); - if (c == '\'') { - inQuote = !inQuote; - } else if (!inQuote && c == ',') { - return; - } - pos++; - } - } -} diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/DeployNamedQuery.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/DeployNamedQuery.java deleted file mode 100644 index 2486d6de9..000000000 --- a/src/main/java/com/avaje/ebeaninternal/server/deploy/DeployNamedQuery.java +++ /dev/null @@ -1,80 +0,0 @@ -package com.avaje.ebeaninternal.server.deploy; - -import javax.persistence.NamedQuery; -import javax.persistence.QueryHint; - -import com.avaje.ebean.RawSql; - -public class DeployNamedQuery { - - private final String name; - - private final String query; - - private final QueryHint[] hints; - - private final DRawSqlSelect sqlSelect; - - private final RawSql rawSql; - - public DeployNamedQuery(NamedQuery namedQuery) { - this.name = namedQuery.name(); - this.query = namedQuery.query(); - this.hints = namedQuery.hints(); - this.sqlSelect = null; - this.rawSql = null; - } - - public DeployNamedQuery(String name, String query, QueryHint[] hints) { - this.name = name; - this.query = query; - this.hints = hints; - this.sqlSelect = null; - this.rawSql = null; - } - - public DeployNamedQuery(String name, RawSql rawSql) { - this.name = name; - this.query = null; - this.hints = null; - this.sqlSelect = null; - this.rawSql = rawSql; - } - - public DeployNamedQuery(DRawSqlSelect sqlSelect) { - this.name = sqlSelect.getName(); - this.query = null; - this.hints = null; - this.sqlSelect = sqlSelect; - this.rawSql = null; - } - - public boolean isRawSql() { - return rawSql != null; - } - - public boolean isSqlSelect() { - return sqlSelect != null; - } - - public String getName() { - return name; - } - - public String getQuery() { - return query; - } - - public QueryHint[] getHints() { - return hints; - } - - public RawSql getRawSql() { - return rawSql; - } - - public DRawSqlSelect getSqlSelect() { - return sqlSelect; - } - -} diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/DeployNamedUpdate.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/DeployNamedUpdate.java deleted file mode 100644 index f5d762745..000000000 --- a/src/main/java/com/avaje/ebeaninternal/server/deploy/DeployNamedUpdate.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.avaje.ebeaninternal.server.deploy; - -import com.avaje.ebean.annotation.NamedUpdate; - -/** - * Deployment information for a named update. - */ -public class DeployNamedUpdate { - - private final String name; - - private final String updateStatement; - - private final boolean notifyCache; - - private String sqlUpdateStatement; - - public DeployNamedUpdate(NamedUpdate update) { - this.name = update.name(); - this.updateStatement = update.update(); - this.notifyCache = update.notifyCache(); - } - - public void initialise(DeployUpdateParser parser) { - sqlUpdateStatement = parser.parse(updateStatement); - } - - public String getName() { - return name; - } - - public String getSqlUpdateStatement() { - return sqlUpdateStatement; - } - - public boolean isNotifyCache() { - return notifyCache; - } - -} diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/DeployOrmXml.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/DeployOrmXml.java deleted file mode 100644 index fedc80baf..000000000 --- a/src/main/java/com/avaje/ebeaninternal/server/deploy/DeployOrmXml.java +++ /dev/null @@ -1,150 +0,0 @@ -package com.avaje.ebeaninternal.server.deploy; - -import com.avaje.ebeaninternal.server.lib.util.Dnode; -import com.avaje.ebeaninternal.server.lib.util.DnodeReader; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.IOException; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -/** - * Controls the creation and caching of BeanManager's, BeanDescriptors, - * BeanTable etc for both beans and tables(MapBeans). - *

- * Also supports some other deployment features such as type conversion. - *

- */ -public class DeployOrmXml { - - private static final Logger logger = LoggerFactory.getLogger(DeployOrmXml.class); - - private final HashMap nativeQueryCache; - - private final ArrayList ormXmlList; - - public DeployOrmXml() { - this.nativeQueryCache = new HashMap(); - this.ormXmlList = findAllOrmXml(); - - initialiseNativeQueries(); - } - - /** - * Register all the native queries in ALL orm xml deployment. - */ - private void initialiseNativeQueries() { - for (Dnode ormXml : ormXmlList) { - initialiseNativeQueries(ormXml); - } - } - - /** - * Register the native queries in this particular orm xml deployment. - */ - private void initialiseNativeQueries(Dnode ormXml) { - - Dnode entityMappings = ormXml.find("entity-mappings"); - if (entityMappings != null) { - List nq = entityMappings.findAll("named-native-query", 1); - for (int i = 0; i < nq.size(); i++) { - Dnode nqNode = nq.get(i); - Dnode nqQueryNode = nqNode.find("query"); - if (nqQueryNode != null) { - String queryContent = nqQueryNode.getNodeContent(); - String queryName = nqNode.getAttribute("name"); - - if (queryName != null && queryContent != null) { - DNativeQuery query = new DNativeQuery(queryContent); - nativeQueryCache.put(queryName, query); - } - } - } - } - } - - /** - * Return a native named query. - *

- * These are loaded from the orm.xml deployment file. - *

- */ - public DNativeQuery getNativeQuery(String name) { - return nativeQueryCache.get(name); - } - - private ArrayList findAllOrmXml() { - - ArrayList ormXmlList = new ArrayList(); - - - String defaultFile = "orm.xml"; - readOrmXml(defaultFile, ormXmlList); - - if (!ormXmlList.isEmpty()) { - StringBuilder sb = new StringBuilder(); - for (Dnode ox : ormXmlList) { - sb.append(", ").append(ox.getAttribute("ebean.filename")); - } - String loadedFiles = sb.toString().substring(2); - logger.info("Deployment xml [" + loadedFiles + "] loaded."); - } - - return ormXmlList; - } - - private void readOrmXml(String ormXmlName, ArrayList ormXmlList) { - - try { - Dnode ormXml = readOrmXmlFromClasspath(ormXmlName); - if (ormXml != null) { - ormXml.setAttribute("ebean.filename", ormXmlName); - ormXmlList.add(ormXml); - } - - } catch (IOException e) { - logger.error("error reading orm xml deployment " + ormXmlName, e); - } - } - - private Dnode readOrmXmlFromClasspath(String ormXmlName) throws IOException { - InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream(ormXmlName); - if (is == null) { - return null; - } else { - return readOrmXml(is); - } - } - - private Dnode readOrmXml(InputStream in) throws IOException { - DnodeReader reader = new DnodeReader(); - Dnode ormXml = reader.parseXml(in); - in.close(); - return ormXml; - } - - /** - * Find the deployment xml for a given entity. This will return null if no - * matching deployment xml is found for this entity. - *

- * This searches all the ormXml files and returns the first match. - *

- */ - public Dnode findEntityDeploymentXml(String className) { - - for (Dnode ormXml : ormXmlList) { - Dnode entityMappings = ormXml.find("entity-mappings"); - - List entities = entityMappings.findAll("entity", "class", className, 1); - if (entities.size() == 1) { - return entities.get(0); - } - } - - return null; - } - -} diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/DeployPropertyParserRawSql.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/DeployPropertyParserRawSql.java deleted file mode 100644 index 23746e15c..000000000 --- a/src/main/java/com/avaje/ebeaninternal/server/deploy/DeployPropertyParserRawSql.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.avaje.ebeaninternal.server.deploy; - -import java.util.Set; - -/** - * Converts logical property names to database columns for the raw sql. - *

- * This is used in building the where and having clauses for SqlSelect queries. - *

- */ -public final class DeployPropertyParserRawSql extends DeployParser { - - private final DRawSqlSelect rawSqlSelect; - - public DeployPropertyParserRawSql(DRawSqlSelect rawSqlSelect) { - this.rawSqlSelect = rawSqlSelect; - } - - /** - * Returns null for raw sql queries. - */ - public Set getIncludes() { - return null; - } - - public String convertWord() { - String r = getDeployWord(word); - return r == null ? word : r; - } - - @Override - public String getDeployWord(String expression) { - DRawSqlColumnInfo columnInfo = rawSqlSelect.getRawSqlColumnInfo(expression); - if (columnInfo == null) { - return null; - } else { - return columnInfo.getName(); - } - } - -} diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/ebeandeploy.dtd b/src/main/java/com/avaje/ebeaninternal/server/deploy/ebeandeploy.dtd deleted file mode 100644 index 37a869e4e..000000000 --- a/src/main/java/com/avaje/ebeaninternal/server/deploy/ebeandeploy.dtd +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/meta/DeployBeanDescriptor.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/meta/DeployBeanDescriptor.java index f4967557d..d5c458122 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/deploy/meta/DeployBeanDescriptor.java +++ b/src/main/java/com/avaje/ebeaninternal/server/deploy/meta/DeployBeanDescriptor.java @@ -1,13 +1,12 @@ package com.avaje.ebeaninternal.server.deploy.meta; import com.avaje.ebean.annotation.Cache; -import com.avaje.ebeaninternal.api.ConcurrencyMode; import com.avaje.ebean.annotation.DocStore; import com.avaje.ebean.annotation.DocStoreMode; import com.avaje.ebean.config.ServerConfig; import com.avaje.ebean.config.TableName; -import com.avaje.ebean.config.dbplatform.PlatformIdGenerator; import com.avaje.ebean.config.dbplatform.IdType; +import com.avaje.ebean.config.dbplatform.PlatformIdGenerator; import com.avaje.ebean.event.BeanFindController; import com.avaje.ebean.event.BeanPersistController; import com.avaje.ebean.event.BeanPersistListener; @@ -16,6 +15,7 @@ import com.avaje.ebean.event.BeanQueryAdapter; import com.avaje.ebean.event.changelog.ChangeLogFilter; import com.avaje.ebean.text.PathProperties; import com.avaje.ebean.util.CamelCaseHelper; +import com.avaje.ebeaninternal.api.ConcurrencyMode; import com.avaje.ebeaninternal.server.core.CacheOptions; import com.avaje.ebeaninternal.server.deploy.BeanDescriptor.EntityType; import com.avaje.ebeaninternal.server.deploy.BeanDescriptorManager; @@ -24,9 +24,6 @@ import com.avaje.ebeaninternal.server.deploy.ChainedBeanPersistListener; import com.avaje.ebeaninternal.server.deploy.ChainedBeanPostLoad; import com.avaje.ebeaninternal.server.deploy.ChainedBeanQueryAdapter; import com.avaje.ebeaninternal.server.deploy.CompoundUniqueConstraint; -import com.avaje.ebeaninternal.server.deploy.DRawSqlMeta; -import com.avaje.ebeaninternal.server.deploy.DeployNamedQuery; -import com.avaje.ebeaninternal.server.deploy.DeployNamedUpdate; import com.avaje.ebeaninternal.server.deploy.InheritInfo; import com.avaje.ebeaninternal.server.deploy.parse.DeployBeanInfo; import com.avaje.ebeaninternal.server.idgen.UuidIdGenerator; @@ -40,7 +37,6 @@ import java.util.Collections; import java.util.Comparator; import java.util.LinkedHashMap; import java.util.List; -import java.util.Map; /** * Describes Beans including their deployment information. @@ -72,12 +68,6 @@ public class DeployBeanDescriptor { private EntityType entityType; - private final Map namedQueries = new LinkedHashMap(); - - private final Map namedUpdates = new LinkedHashMap(); - - private final Map rawSqlMetas = new LinkedHashMap(); - private DeployBeanPropertyAssocOne unidirectional; /** @@ -309,32 +299,6 @@ public class DeployBeanDescriptor { return false; } - public Collection getRawSqlMeta() { - if (!processedRawSqlExtend) { - rawSqlProcessExtend(); - processedRawSqlExtend = true; - } - return rawSqlMetas.values(); - } - - /** - * Process the "extend" attributes of raw SQL. Aka inherit the query and - * column mapping. - */ - private void rawSqlProcessExtend() { - - for (DRawSqlMeta rawSqlMeta : rawSqlMetas.values()) { - String extend = rawSqlMeta.getExtend(); - if (extend != null) { - DRawSqlMeta parentQuery = rawSqlMetas.get(extend); - if (parentQuery == null) { - throw new RuntimeException("parent query [" + extend + "] not found for sql-select " + rawSqlMeta.getName()); - } - rawSqlMeta.extend(parentQuery); - } - } - } - public DeployBeanTable createDeployBeanTable() { DeployBeanTable beanTable = new DeployBeanTable(getBeanType()); @@ -380,32 +344,6 @@ public class DeployBeanDescriptor { return sequenceAllocationSize; } - public void add(DRawSqlMeta rawSqlMeta) { - rawSqlMetas.put(rawSqlMeta.getName(), rawSqlMeta); - if ("default".equals(rawSqlMeta.getName())) { - setEntityType(EntityType.SQL); - } - } - - public void add(DeployNamedUpdate namedUpdate) { - namedUpdates.put(namedUpdate.getName(), namedUpdate); - } - - public void add(DeployNamedQuery namedQuery) { - namedQueries.put(namedQuery.getName(), namedQuery); - if ("default".equals(namedQuery.getName())) { - setEntityType(EntityType.SQL); - } - } - - public Map getNamedQueries() { - return namedQueries; - } - - public Map getNamedUpdates() { - return namedUpdates; - } - public String[] getProperties() { return properties; } diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/parse/AnnotationClass.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/parse/AnnotationClass.java index 424c2b39f..ffe34179e 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/deploy/parse/AnnotationClass.java +++ b/src/main/java/com/avaje/ebeaninternal/server/deploy/parse/AnnotationClass.java @@ -7,16 +7,12 @@ import com.avaje.ebean.annotation.Draftable; import com.avaje.ebean.annotation.DraftableElement; import com.avaje.ebean.annotation.History; import com.avaje.ebean.annotation.Index; -import com.avaje.ebean.annotation.NamedUpdate; -import com.avaje.ebean.annotation.NamedUpdates; import com.avaje.ebean.annotation.ReadAudit; import com.avaje.ebean.annotation.UpdateMode; import com.avaje.ebean.annotation.View; import com.avaje.ebean.config.TableName; import com.avaje.ebeaninternal.server.deploy.BeanDescriptor.EntityType; import com.avaje.ebeaninternal.server.deploy.CompoundUniqueConstraint; -import com.avaje.ebeaninternal.server.deploy.DeployNamedQuery; -import com.avaje.ebeaninternal.server.deploy.DeployNamedUpdate; import com.avaje.ebeaninternal.server.deploy.meta.DeployBeanProperty; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -25,8 +21,6 @@ import javax.persistence.AttributeOverride; import javax.persistence.Column; import javax.persistence.Embeddable; import javax.persistence.Entity; -import javax.persistence.NamedQueries; -import javax.persistence.NamedQuery; import javax.persistence.Table; import javax.persistence.UniqueConstraint; @@ -181,53 +175,10 @@ public class AnnotationClass extends AnnotationParser { descriptor.setUpdateChangesOnly(updateMode.updateChangesOnly()); } - NamedQueries namedQueries = cls.getAnnotation(NamedQueries.class); - if (namedQueries != null) { - readNamedQueries(namedQueries); - } - NamedQuery namedQuery = cls.getAnnotation(NamedQuery.class); - if (namedQuery != null) { - readNamedQuery(namedQuery); - } - - NamedUpdates namedUpdates = cls.getAnnotation(NamedUpdates.class); - if (namedUpdates != null) { - readNamedUpdates(namedUpdates); - } - - NamedUpdate namedUpdate = cls.getAnnotation(NamedUpdate.class); - if (namedUpdate != null) { - readNamedUpdate(namedUpdate); - } - Cache cache = cls.getAnnotation(Cache.class); if (cache != null && !disableL2Cache) { descriptor.setCache(cache); } } - private void readNamedQueries(NamedQueries namedQueries) { - NamedQuery[] queries = namedQueries.value(); - for (int i = 0; i < queries.length; i++) { - readNamedQuery(queries[i]); - } - } - - private void readNamedQuery(NamedQuery namedQuery) { - DeployNamedQuery q = new DeployNamedQuery(namedQuery); - descriptor.add(q); - } - - private void readNamedUpdates(NamedUpdates updates) { - NamedUpdate[] updateArray = updates.value(); - for (int i = 0; i < updateArray.length; i++) { - readNamedUpdate(updateArray[i]); - } - } - - private void readNamedUpdate(NamedUpdate update) { - DeployNamedUpdate upd = new DeployNamedUpdate(update); - descriptor.add(upd); - } - } diff --git a/src/main/java/com/avaje/ebeaninternal/server/lib/util/Dnode.java b/src/main/java/com/avaje/ebeaninternal/server/lib/util/Dnode.java deleted file mode 100644 index 440e285f8..000000000 --- a/src/main/java/com/avaje/ebeaninternal/server/lib/util/Dnode.java +++ /dev/null @@ -1,321 +0,0 @@ -package com.avaje.ebeaninternal.server.lib.util; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.LinkedHashMap; -import java.util.List; - -/** - * A lightweight tree structure for simple XML handling. - *

- * It removes support for nodes being mixed with content. That is, a node can - * only contain content or a list of one or more child nodes. It does not - * support mixing bits of content between the child nodes. - *

- *

- * Although designed to simplify XML in supported cases it can be used as a - * general tree structure with attributes of java Objects. - *

- */ -public class Dnode { - - int level; - - String nodeName; - - String nodeContent; - - ArrayList children; - - final LinkedHashMap attrList = new LinkedHashMap(); - - /** - * Create a node. - */ - public Dnode() { - } - - /** - * Parse the raw XML string. - */ - public static Dnode parse(String s){ - DnodeReader r = new DnodeReader(); - return r.parseXml(s); - } - - /** - * Return the node as XML. - */ - public String toXml() { - StringBuilder sb = new StringBuilder(); - generate(sb); - return sb.toString(); - } - - /** - * Generate this node as xml to the buffer. - */ - public void generate(StringBuilder sb) { - if (sb == null) { - sb = new StringBuilder(); - } - sb.append("<").append(nodeName); - for (String attr : attrList.keySet()) { - Object attrValue = getAttribute(attr); - sb.append(" ").append(attr).append("=\""); - if (attrValue != null) { - sb.append(attrValue); - } - sb.append("\""); - } - - if (nodeContent == null && !hasChildren()) { - sb.append(" />"); - - } else { - sb.append(">"); - if (children != null && children.size() > 0) { - for (int i = 0; i < children.size(); i++) { - Dnode child = children.get(i); - child.generate(sb); - } - } - if (nodeContent != null) { - sb.append(nodeContent); - } - sb.append(""); - } - } - - /** - * Return the node name. - */ - public String getNodeName() { - return nodeName; - } - - /** - * Set the node name. - */ - public void setNodeName(String nodeName) { - this.nodeName = nodeName; - } - - /** - * Return the node content. - */ - public String getNodeContent() { - return nodeContent; - } - - /** - * Set the node content. - */ - public void setNodeContent(String nodeContent) { - this.nodeContent = nodeContent; - } - - /** - * Return true if this node has children. - */ - public boolean hasChildren() { - return getChildrenCount() > 0; - } - - /** - * Return the number of children this node has. - */ - public int getChildrenCount() { - if (children == null) { - return 0; - } - return children.size(); - } - - /** - * Remove a ancestor node. - */ - public boolean remove(Dnode node) { - if (children == null) { - return false; - } - if (children.remove(node)) { - return true; - } - for (Dnode child : children) { - if (child.remove(node)) { - return true; - } - } - return false; - } - - /** - * List of children nodes. - */ - public List children() { - if (children == null) { - return null; - } - return children; - } - - /** - * Add a child. - */ - public void addChild(Dnode child) { - if (children == null) { - children = new ArrayList(); - } - children.add(child); - child.setLevel(level + 1); - } - - /** - * Return the level or depth of the node from the root. - */ - public int getLevel() { - return level; - } - - /** - * Set the level or depth of this node from the root. - */ - public void setLevel(int level) { - this.level = level; - if (children != null) { - for (int i = 0; i < children.size(); i++) { - Dnode child = children.get(i); - child.setLevel(level + 1); - } - } - } - - /** - * Find the first matching node using nodeName. This is a depth first tree - * search. - */ - public Dnode find(String nodeName) { - return find(nodeName, null, null); - } - - /** - * Find the first node matching nodeName and attribute value. This is a - * depth first tree search. - */ - public Dnode find(String nodeName, String attrName, Object value) { - - return find(nodeName, attrName, value, -1); - - } - - /** - * Search for a single node with control over maxLevel. Find the first node - * matching nodeName and attribute value. If attrName and value are null - * then this will just search using the nodeName. This is a depth first tree - * search. Once a matching node is found the search will stop. - */ - public Dnode find(String nodeName, String attrName, Object value, int maxLevel) { - - ArrayList list = new ArrayList(); - findByNode(list, nodeName, true, attrName, value, maxLevel); - if (list.size() >= 1) { - return list.get(0); - } - return null; - } - - /** - * Find all the nodes that match the nodeName. - * - */ - public List findAll(String nodeName, int maxLevel) { - int level = -1; - if (maxLevel > 0) { - level = this.level + maxLevel; - } - return findAll(nodeName, null, null, level); - } - - /** - * Find all the nodes that match the nodeName and attribute value. - */ - public List findAll(String nodeName, String attrName, Object value, int maxLevel) { - - if (nodeName == null && attrName == null) { - throw new RuntimeException("You can not have both nodeName and attrName null"); - } - ArrayList list = new ArrayList(); - findByNode(list, nodeName, false, attrName, value, maxLevel); - return list; - } - - /** - * Used for recursive calling. - */ - private void findByNode(List list, String node, boolean findOne,String attrName, Object value, int maxLevel) { - - if (findOne && list.size() == 1) { - return; - } - if (node == null || node.equals(nodeName)) { - if (attrName == null || value.equals(getAttribute(attrName))) { - list.add(this); - if (findOne) { - return; - } - } - } - if (maxLevel > 0 && level >= maxLevel) { - // hit max level - - } else if (children != null) { - // recursively search the children - for (int i = 0; i < children.size(); i++) { - Dnode child = children.get(i); - child.findByNode(list, node, findOne, attrName, value,maxLevel); - } - } - } - - /** - * The attribute names as strings. - */ - public Collection attributeNames() { - return attrList.keySet(); - } - - /** - * Return the attribute for a given name. - */ - public String getAttribute(String name) { - return attrList.get(name); - } - - /** - * Returns an Attribute as a String. - *

- * Will throw a ClassCastException if the attribute is not a String. - *

- */ - public String getStringAttr(String name, String defaultValue) { - Object o = attrList.get(name); - if (o == null){ - return defaultValue; - } else { - return o.toString(); - } - } - - /** - * Set an attribute. - */ - public void setAttribute(String name, String value) { - attrList.put(name, value); - } - - public String toString() { - return "[" + getNodeName() + " " + attrList + "]"; - } - -} diff --git a/src/main/java/com/avaje/ebeaninternal/server/lib/util/DnodeParser.java b/src/main/java/com/avaje/ebeaninternal/server/lib/util/DnodeParser.java deleted file mode 100644 index e798a77ed..000000000 --- a/src/main/java/com/avaje/ebeaninternal/server/lib/util/DnodeParser.java +++ /dev/null @@ -1,200 +0,0 @@ -package com.avaje.ebeaninternal.server.lib.util; - -import java.util.Stack; - -import org.xml.sax.Attributes; -import org.xml.sax.SAXException; -import org.xml.sax.helpers.DefaultHandler; - -/** - * Parse an xml document into a Dnode tree. - */ -public class DnodeParser extends DefaultHandler { - - /** - * The root of the DContent tree. - */ - Dnode root; - - /** - * The current node being parsed. - */ - Dnode currentNode; - - /** - * The nodeContent buffer. - */ - StringBuilder buffer; - - /** - * Used to stack the nodes. - */ - final Stack stack = new Stack(); - - /** - * The class used to construct new nodes. Should be Dnode or a subtype of - * Dnode. - */ - Class nodeClass = Dnode.class; - - int depth = 0; - - /** - * Trim whitespace from the content. - */ - boolean trimWhitespace = true; - - /** - * The name of the tag that contains html content - */ - String contentName; - - /** - * The depth of the tag that contains the html content - */ - int contentDepth; - - - /** - * If true then trim the whitespace from the content. - */ - public boolean isTrimWhitespace() { - return trimWhitespace; - } - - /** - * Set whether to trim whitespace from the content. - */ - public void setTrimWhitespace(boolean trimWhitespace) { - this.trimWhitespace = trimWhitespace; - } - - /** - * Return the root node of the DContent tree. - */ - public Dnode getRoot() { - return root; - } - - /** - * Set the type class of node to be created. - */ - public void setNodeClass(Class nodeClass) { - this.nodeClass = nodeClass; - } - - /** - * Create a new Dnode using the nodeClass. - */ - private Dnode createNewNode() { - try { - return (Dnode) nodeClass.newInstance(); - } catch (Exception ex) { - throw new RuntimeException(ex); - } - } - - - /** - * process a startElement. - */ - public void startElement(String uri, String localName, String qName, Attributes attributes) - throws SAXException { - - super.startElement(uri, localName, qName, attributes); - depth++; - - boolean isContent = (contentName != null); - - if (isContent){ - // must be html content... add the begin tag as content - buffer.append("<").append(localName); - for (int i = 0; i < attributes.getLength(); i++) { - String key = attributes.getLocalName(i); - String val = attributes.getValue(i); - buffer.append(" ").append(key).append("='").append(val).append("'"); - } - buffer.append(">"); - return; - - } - - buffer = new StringBuilder(); - Dnode node = createNewNode(); - node.setNodeName(localName); - for (int i = 0; i < attributes.getLength(); i++) { - String key = attributes.getLocalName(i); - String val = attributes.getValue(i); - node.setAttribute(key, val); - if ("type".equalsIgnoreCase(key) && "content".equalsIgnoreCase(val)) { - // this tag contains html content - // no more nodes until end tag is found - contentName = localName; - contentDepth = depth-1; - } - - } - if (root == null) { - root = node; - } - if (currentNode != null) { - currentNode.addChild(node); - } - stack.push(node); - currentNode = node; - - } - - /** - * append the node content. - */ - public void characters(char[] ch, int start, int length) throws SAXException { - super.characters(ch, start, length); - String s = new String(ch, start, length); - int p = s.indexOf('\r'); - int p2 = s.indexOf('\n'); - if (p == -1 && p2 > -1) { - // This is probably not an issue but tidys up content - // in my text editor - s = StringHelper.replaceString(s, "\n", "\r\n"); - } - buffer.append(s); - } - - /** - * process the endElement. - */ - public void endElement(String uri, String localName, String qName) throws SAXException { - super.endElement(uri, localName, qName); - depth--; - - if (contentName != null){ - // is this the end of the content? - if (contentName.equals(localName) && contentDepth == depth){ - contentName = null; - - } else { - // the html content end tag - buffer.append(""); - } - return; - } - String content = buffer.toString(); - buffer.setLength(0); - if (content.length() > 0) { - if (trimWhitespace) { - content = content.trim(); - } - if (content.length() > 0) { - currentNode.setNodeContent(content); - } - } - stack.pop(); - if (!stack.isEmpty()) { - // get the new currentNode - currentNode = stack.pop(); - stack.push(currentNode); - } - } - -} diff --git a/src/main/java/com/avaje/ebeaninternal/server/lib/util/DnodeReader.java b/src/main/java/com/avaje/ebeaninternal/server/lib/util/DnodeReader.java deleted file mode 100644 index 0514bb20c..000000000 --- a/src/main/java/com/avaje/ebeaninternal/server/lib/util/DnodeReader.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.avaje.ebeaninternal.server.lib.util; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStreamWriter; -import java.io.StringReader; - -import org.xml.sax.InputSource; -import org.xml.sax.XMLReader; -import org.xml.sax.helpers.XMLReaderFactory; - -/** - * Parses an XML inputstream returning a Dnode tree. - */ -public class DnodeReader { - - public Dnode parseXml(String str) { - - try { - ByteArrayOutputStream bao = new ByteArrayOutputStream(str.length()); - OutputStreamWriter osw = new OutputStreamWriter(bao); - - StringReader sr = new StringReader(str); - - int charBufferSize = 1024; - char[] buf = new char[charBufferSize]; - int len; - while ((len = sr.read(buf, 0, buf.length)) != -1) { - osw.write(buf, 0, len); - } - sr.close(); - osw.flush(); - osw.close(); - - bao.flush(); - bao.close(); - - InputStream is = new ByteArrayInputStream(bao.toByteArray()); - return parseXml(is); - - } catch (IOException ex){ - throw new RuntimeException(ex); - } - } - - /** - * Parse the XML inputstream returning the Dnode tree. - */ - public Dnode parseXml(InputStream in) { - - try { - InputSource inSource = new InputSource(in); - - DnodeParser parser = new DnodeParser(); - - XMLReader myReader = XMLReaderFactory.createXMLReader(); - myReader.setContentHandler(parser); - - myReader.parse(inSource); - - return parser.getRoot(); - - } catch (Exception e) { - throw new RuntimeException(e); - } - } - -} diff --git a/src/main/java/com/avaje/ebeaninternal/server/query/CQuery.java b/src/main/java/com/avaje/ebeaninternal/server/query/CQuery.java index 39972cd35..b69526d6f 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/query/CQuery.java +++ b/src/main/java/com/avaje/ebeaninternal/server/query/CQuery.java @@ -590,13 +590,6 @@ public class CQuery implements DbReadContext, CancelableQuery { request.getGraphContext().register(path, bc); } - /** - * Return the query name. - */ - public String getName() { - return query.getName(); - } - /** * Return true if this is a raw sql query as opposed to Ebean generated sql. */ diff --git a/src/main/java/com/avaje/ebeaninternal/server/query/CQueryBuilder.java b/src/main/java/com/avaje/ebeaninternal/server/query/CQueryBuilder.java index 06a08486c..e9dde50d5 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/query/CQueryBuilder.java +++ b/src/main/java/com/avaje/ebeaninternal/server/query/CQueryBuilder.java @@ -38,7 +38,6 @@ public class CQueryBuilder { private final SqlLimiter sqlLimiter; - private final RawSqlSelectClauseBuilder sqlSelectBuilder; private final CQueryBuilderRawSql rawSqlHandler; private final Binder binder; @@ -62,7 +61,6 @@ public class CQueryBuilder { this.historySupport = historySupport; this.tableAliasPlaceHolder = dbPlatform.getTableAliasPlaceHolder(); this.columnAliasPrefix = dbPlatform.getColumnAliasPrefix(); - this.sqlSelectBuilder = new RawSqlSelectClauseBuilder(dbPlatform, binder); this.sqlLimiter = dbPlatform.getSqlLimiter(); this.rawSqlHandler = new CQueryBuilderRawSql(sqlLimiter, dbPlatform); this.selectCountWithAlias = dbPlatform.isSelectCountWithAlias(); @@ -260,10 +258,6 @@ public class CQueryBuilder { */ public CQuery buildQuery(OrmQueryRequest request) { - if (request.isSqlSelect()) { - return sqlSelectBuilder.build(request); - } - CQueryPredicates predicates = new CQueryPredicates(binder, request); CQueryPlan queryPlan = request.getQueryPlan(); diff --git a/src/main/java/com/avaje/ebeaninternal/server/query/CQueryEngine.java b/src/main/java/com/avaje/ebeaninternal/server/query/CQueryEngine.java index a3171a5a7..26153674d 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/query/CQueryEngine.java +++ b/src/main/java/com/avaje/ebeaninternal/server/query/CQueryEngine.java @@ -466,7 +466,6 @@ public class CQueryEngine { } msg.append("exeMicros[").append(q.getQueryExecutionTimeMicros()); msg.append("] rows[").append(q.getLoadedRowDetail()); - msg.append("] name[").append(q.getName()); msg.append("] predicates[").append(q.getLogWhereSql()); msg.append("] bind[").append(q.getBindLog()).append("]"); diff --git a/src/main/java/com/avaje/ebeaninternal/server/query/RawSqlSelectClauseBuilder.java b/src/main/java/com/avaje/ebeaninternal/server/query/RawSqlSelectClauseBuilder.java deleted file mode 100644 index c79dc478a..000000000 --- a/src/main/java/com/avaje/ebeaninternal/server/query/RawSqlSelectClauseBuilder.java +++ /dev/null @@ -1,97 +0,0 @@ -package com.avaje.ebeaninternal.server.query; - -import javax.persistence.PersistenceException; - -import com.avaje.ebean.config.dbplatform.DatabasePlatform; -import com.avaje.ebean.config.dbplatform.SqlLimitResponse; -import com.avaje.ebean.config.dbplatform.SqlLimiter; -import com.avaje.ebeaninternal.api.SpiQuery; -import com.avaje.ebeaninternal.server.core.OrmQueryRequest; -import com.avaje.ebeaninternal.server.deploy.BeanDescriptor; -import com.avaje.ebeaninternal.server.deploy.DRawSqlSelect; -import com.avaje.ebeaninternal.server.deploy.DeployNamedQuery; -import com.avaje.ebeaninternal.server.deploy.DeployParser; -import com.avaje.ebeaninternal.server.persist.Binder; -import com.avaje.ebeaninternal.server.querydefn.OrmQueryLimitRequest; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Factory for SqlSelectClause based on raw sql. - *

- * Its job is to execute the sql, read the meta data to determine the columns to - * bean property mapping. - *

- */ -public class RawSqlSelectClauseBuilder { - - private static final Logger logger = LoggerFactory.getLogger(RawSqlSelectClauseBuilder.class); - - private final Binder binder; - - private final SqlLimiter dbQueryLimiter; - private final DatabasePlatform dbPlatform; - - public RawSqlSelectClauseBuilder(DatabasePlatform dbPlatform, Binder binder) { - - this.binder = binder; - this.dbQueryLimiter = dbPlatform.getSqlLimiter(); - this.dbPlatform = dbPlatform; - } - - /** - * Build based on the includes and using the BeanJoinTree. - */ - public CQuery build(OrmQueryRequest request) throws PersistenceException { - - SpiQuery query = request.getQuery(); - BeanDescriptor desc = request.getBeanDescriptor(); - - DeployNamedQuery namedQuery = desc.getNamedQuery(query.getName()); - DRawSqlSelect sqlSelect = namedQuery.getSqlSelect(); - - // create a parser for this specific SqlSelect... has to be really - // as each SqlSelect could have different table alias etc - DeployParser parser = sqlSelect.createDeployPropertyParser(); - - CQueryPredicates predicates = new CQueryPredicates(binder, request); - // prepare and convert logical property names to dbColumns etc - predicates.prepareRawSql(parser); - - SqlTreeAlias alias = new SqlTreeAlias(sqlSelect.getTableAlias()); - predicates.parseTableAlias(alias); - - String sql = null; - try { - - boolean includeRowNumColumn = false; - String orderBy = sqlSelect.getOrderBy(predicates); - - // build the actual sql String - sql = sqlSelect.buildSql(orderBy, predicates, request); - if (query.hasMaxRowsOrFirstRow() && dbQueryLimiter != null) { - // wrap with a limit offset or ROW_NUMBER() etc - SqlLimitResponse limitSql = dbQueryLimiter.limit(new OrmQueryLimitRequest(sql, orderBy, query, dbPlatform)); - includeRowNumColumn = limitSql.isIncludesRowNumberColumn(); - - sql = limitSql.getSql(); - } else { - // add back select keyword - // ... was removed to support dbQueryLimiter - sql = "select " + sql; - } - - SqlTree sqlTree = sqlSelect.getSqlTree(); - - CQueryPlan queryPlan = new CQueryPlan(request, sql, sqlTree, true, includeRowNumColumn, ""); - return new CQuery(request, predicates, queryPlan); - - } catch (Exception e) { - - String msg = "Error with " + desc.getFullName() + " query:\r" + sql; - logger.error(msg); - throw new PersistenceException(e); - } - } - -} diff --git a/src/main/java/com/avaje/ebeaninternal/server/querydefn/DefaultOrmQuery.java b/src/main/java/com/avaje/ebeaninternal/server/querydefn/DefaultOrmQuery.java index 1e7d17e83..cf47df856 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/querydefn/DefaultOrmQuery.java +++ b/src/main/java/com/avaje/ebeaninternal/server/querydefn/DefaultOrmQuery.java @@ -21,14 +21,11 @@ import com.avaje.ebeaninternal.api.SpiQuerySecondary; import com.avaje.ebeaninternal.server.autotune.ProfilingListener; import com.avaje.ebeaninternal.server.deploy.BeanDescriptor; import com.avaje.ebeaninternal.server.deploy.BeanPropertyAssocMany; -import com.avaje.ebeaninternal.server.deploy.DRawSqlSelect; -import com.avaje.ebeaninternal.server.deploy.DeployNamedQuery; import com.avaje.ebeaninternal.server.deploy.TableJoin; import com.avaje.ebeaninternal.server.expression.DefaultExpressionList; import com.avaje.ebeaninternal.server.expression.SimpleExpression; import com.avaje.ebeaninternal.server.query.CancelableQuery; -import javax.persistence.PersistenceException; import java.sql.Timestamp; import java.util.ArrayList; import java.util.Iterator; @@ -61,11 +58,6 @@ public class DefaultOrmQuery implements SpiQuery { private CancelableQuery cancelableQuery; - /** - * The name of the query. - */ - private String name; - private Type type; private Mode mode = Mode.NORMAL; @@ -194,8 +186,6 @@ public class DefaultOrmQuery implements SpiQuery { private PersistenceContextScope persistenceContextScope; - private boolean sqlSelect; - /** * Allow for explicit on off or null for default. */ @@ -240,47 +230,12 @@ public class DefaultOrmQuery implements SpiQuery { private boolean useDocStore; - public DefaultOrmQuery(BeanDescriptor desc, EbeanServer server, ExpressionFactory expressionFactory, String query) { + public DefaultOrmQuery(BeanDescriptor desc, EbeanServer server, ExpressionFactory expressionFactory) { this.beanDescriptor = desc; this.beanType = desc.getBeanType(); this.server = server; this.expressionFactory = expressionFactory; this.detail = new OrmQueryDetail(); - this.name = ""; - if (query != null) { - setQuery(query); - } - } - - /** - * Additional supply a query which is parsed. - */ - public DefaultOrmQuery(BeanDescriptor desc, EbeanServer server, ExpressionFactory expressionFactory, - DeployNamedQuery namedQuery) throws PersistenceException { - - this.beanDescriptor = desc; - this.beanType = desc.getBeanType(); - this.server = server; - this.expressionFactory = expressionFactory; - this.detail = new OrmQueryDetail(); - if (namedQuery == null) { - this.name = ""; - } else { - this.name = namedQuery.getName(); - this.sqlSelect = namedQuery.isSqlSelect(); - if (sqlSelect) { - // potentially with where and having clause... - DRawSqlSelect sqlSelect = namedQuery.getSqlSelect(); - additionalWhere = sqlSelect.getWhereClause(); - additionalHaving = sqlSelect.getHavingClause(); - } else if (namedQuery.isRawSql()) { - rawSql = namedQuery.getRawSql(); - - } else { - // parse the entire query... - setQuery(namedQuery.getQuery()); - } - } } @Override @@ -290,7 +245,7 @@ public class DefaultOrmQuery implements SpiQuery { @Override public boolean isAutoTunable() { - return beanDescriptor.isAutoTunable() && !isSqlSelect(); + return beanDescriptor.isAutoTunable(); } @Override @@ -496,7 +451,7 @@ public class DefaultOrmQuery implements SpiQuery { if (Mode.LAZYLOAD_MANY.equals(getMode())) { return false; - } else if (hasMaxRowsOrFirstRow() && !isRawSql() && !isSqlSelect()) { + } else if (hasMaxRowsOrFirstRow() && !isRawSql()) { return false; } return true; @@ -605,8 +560,7 @@ public class DefaultOrmQuery implements SpiQuery { @Override public DefaultOrmQuery copy(EbeanServer server) { - DefaultOrmQuery copy = new DefaultOrmQuery(beanDescriptor, server, expressionFactory, (String) null); - copy.name = name; + DefaultOrmQuery copy = new DefaultOrmQuery(beanDescriptor, server, expressionFactory); copy.includeTableJoin = includeTableJoin; copy.profilingListener = profilingListener; @@ -623,7 +577,6 @@ public class DefaultOrmQuery implements SpiQuery { copy.excludeBeanCache = excludeBeanCache; copy.useQueryCache = useQueryCache; copy.readOnly = readOnly; - copy.sqlSelect = sqlSelect; if (detail != null) { copy.detail = detail.copy(); } @@ -744,7 +697,7 @@ public class DefaultOrmQuery implements SpiQuery { @Override public Boolean isAutoTune() { - return sqlSelect ? Boolean.FALSE : autoTune; + return autoTune; } @Override @@ -946,19 +899,6 @@ public class DefaultOrmQuery implements SpiQuery { return new HashQuery(queryPlanKey, hc); } - /** - * Return the query name. - */ - @Override - public String getName() { - return name; - } - - @Override - public boolean isSqlSelect() { - return sqlSelect; - } - @Override public boolean isRawSql() { return rawSql != null; @@ -1065,16 +1005,6 @@ public class DefaultOrmQuery implements SpiQuery { return this; } - public void setQuery(String queryString) throws PersistenceException { - - this.query = queryString; - - OrmQueryDetailParser parser = new OrmQueryDetailParser(queryString); - parser.parse(); - parser.assign(this); - } - - protected void setRawWhereClause(String rawWhereClause) { this.rawWhereClause = rawWhereClause; } diff --git a/src/main/java/com/avaje/ebeaninternal/server/querydefn/DefaultOrmUpdate.java b/src/main/java/com/avaje/ebeaninternal/server/querydefn/DefaultOrmUpdate.java index 76fb508c2..8b0a65a51 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/querydefn/DefaultOrmUpdate.java +++ b/src/main/java/com/avaje/ebeaninternal/server/querydefn/DefaultOrmUpdate.java @@ -5,7 +5,6 @@ import java.io.Serializable; import com.avaje.ebean.EbeanServer; import com.avaje.ebeaninternal.api.BindParams; import com.avaje.ebeaninternal.api.SpiUpdate; -import com.avaje.ebeaninternal.server.deploy.DeployNamedUpdate; /** * Default implementation of OrmUpdate. @@ -60,20 +59,6 @@ public final class DefaultOrmUpdate implements SpiUpdate, Serializable { this.name = ""; this.updateStatement = updateStatement; this.type = deriveType(updateStatement); - - } - - public DefaultOrmUpdate(Class beanType, EbeanServer server, String baseTable, DeployNamedUpdate namedUpdate) { - - this.beanType = beanType; - this.server = server; - this.baseTable = baseTable; - this.name = namedUpdate.getName(); - this.notifyCache = namedUpdate.isNotifyCache(); - - // named updates are always converted to sql as part of the initialisation - this.updateStatement = namedUpdate.getSqlUpdateStatement(); - this.type = deriveType(updateStatement); } public DefaultOrmUpdate setTimeout(int secs) { diff --git a/src/test/java/com/avaje/ebeaninternal/api/TDSpiEbeanServer.java b/src/test/java/com/avaje/ebeaninternal/api/TDSpiEbeanServer.java index 3815a253a..0f4be7aea 100644 --- a/src/test/java/com/avaje/ebeaninternal/api/TDSpiEbeanServer.java +++ b/src/test/java/com/avaje/ebeaninternal/api/TDSpiEbeanServer.java @@ -275,16 +275,6 @@ public class TDSpiEbeanServer implements SpiEbeanServer { return null; } - @Override - public Query createNamedQuery(Class beanType, String namedQuery) { - return null; - } - - @Override - public Query createQuery(Class beanType, String query) { - return null; - } - @Override public Query createQuery(Class beanType) { return null; @@ -315,11 +305,6 @@ public class TDSpiEbeanServer implements SpiEbeanServer { } - @Override - public Update createNamedUpdate(Class beanType, String namedUpdate) { - return null; - } - @Override public Update createUpdate(Class beanType, String ormUpdate) { return null; @@ -330,11 +315,6 @@ public class TDSpiEbeanServer implements SpiEbeanServer { return null; } - @Override - public SqlQuery createNamedSqlQuery(String namedQuery) { - return null; - } - @Override public SqlUpdate createSqlUpdate(String sql) { return null; @@ -345,11 +325,6 @@ public class TDSpiEbeanServer implements SpiEbeanServer { return null; } - @Override - public SqlUpdate createNamedSqlUpdate(String namedQuery) { - return null; - } - @Override public void register(TransactionCallback transactionCallback) throws PersistenceException { diff --git a/src/test/java/com/avaje/ebeaninternal/server/querydefn/TestQueryLanguage.java b/src/test/java/com/avaje/ebeaninternal/server/querydefn/TestQueryLanguage.java index 88714a5c5..ff9d8e931 100644 --- a/src/test/java/com/avaje/ebeaninternal/server/querydefn/TestQueryLanguage.java +++ b/src/test/java/com/avaje/ebeaninternal/server/querydefn/TestQueryLanguage.java @@ -89,7 +89,7 @@ public class TestQueryLanguage extends BaseTestCase { BeanDescriptor desc = server.getBeanDescriptor(Order.class); DefaultOrmQuery qry = new DefaultOrmQuery(desc, server, - new DefaultExpressionFactory(false, false), (String) null); + new DefaultExpressionFactory(false, false)); p.assign(qry); return qry; diff --git a/src/test/java/com/avaje/tests/basic/TestJoinInheritance.java b/src/test/java/com/avaje/tests/basic/TestJoinInheritance.java index 4a96d35c4..96d1c9e56 100644 --- a/src/test/java/com/avaje/tests/basic/TestJoinInheritance.java +++ b/src/test/java/com/avaje/tests/basic/TestJoinInheritance.java @@ -80,22 +80,5 @@ public class TestJoinInheritance extends BaseTestCase { Ebean.save(trip); } - Ebean.beginTransaction(); - - Query q = Ebean.createQuery(Trip.class, "join address join vehicleDriver "); - - List trips = q.findList(); - - Assert.assertTrue(trips.size() == nrDrivers); - - for (Trip t:trips){ - Address a = t.getAddress(); - Assert.assertTrue(line1.equals(a.getLine1())); - Assert.assertTrue(line2.equals(a.getLine2())); - Assert.assertTrue(city.equals(a.getCity())); - } - - - Ebean.endTransaction(); } } diff --git a/src/test/java/com/avaje/tests/basic/TestMappedSuper.java b/src/test/java/com/avaje/tests/basic/TestMappedSuper.java index ccca84c8b..8ac108ddd 100644 --- a/src/test/java/com/avaje/tests/basic/TestMappedSuper.java +++ b/src/test/java/com/avaje/tests/basic/TestMappedSuper.java @@ -1,14 +1,10 @@ package com.avaje.tests.basic; -import java.util.List; - -import org.junit.Assert; -import org.junit.Test; - import com.avaje.ebean.BaseTestCase; import com.avaje.ebean.Ebean; -import com.avaje.ebean.Query; import com.avaje.tests.model.basic.TMapSuperEntity; +import org.junit.Assert; +import org.junit.Test; public class TestMappedSuper extends BaseTestCase { @@ -28,19 +24,6 @@ public class TestMappedSuper extends BaseTestCase { Assert.assertNotNull(e2); - // using a raw SQL query that populates a transient field - Query query = Ebean.createNamedQuery(TMapSuperEntity.class, "testTransient"); - - List list = query.where() - .gt("id", 0) - .istartsWith("name", "bab") - .findList(); - - Assert.assertTrue(list.size() >= 1); - TMapSuperEntity e3 = list.get(0); - Integer myint = e3.getMyint(); - Assert.assertEquals(Integer.valueOf(12), myint); - TMapSuperEntity eSaveDelete = new TMapSuperEntity(); eSaveDelete.setName("babana"); diff --git a/src/test/java/com/avaje/tests/basic/TestOrderTotalAmountReportBean.java b/src/test/java/com/avaje/tests/basic/TestOrderTotalAmountReportBean.java index 0522de3c2..8337e57d2 100644 --- a/src/test/java/com/avaje/tests/basic/TestOrderTotalAmountReportBean.java +++ b/src/test/java/com/avaje/tests/basic/TestOrderTotalAmountReportBean.java @@ -2,6 +2,8 @@ package com.avaje.tests.basic; import java.util.List; +import com.avaje.ebean.RawSql; +import com.avaje.ebean.RawSqlBuilder; import org.junit.Assert; import org.junit.Test; @@ -17,23 +19,25 @@ public class TestOrderTotalAmountReportBean extends BaseTestCase { ResetBasicData.reset(); - List l0 = Ebean.find(OrderAggregate.class).findList(); + String sql = + "select order_id, count(*) as totalItems, sum(order_qty*unit_price) as totalAmount \n" + + "from o_order_detail \n" + + "group by order_id"; + + RawSql rawSql = RawSqlBuilder.parse(sql).columnMapping("order_id", "order.id").create(); + + List l0 = + Ebean.find(OrderAggregate.class) + .setRawSql(rawSql) + .findList(); for (OrderAggregate r0 : l0) { r0.toString(); } - List list = Ebean.createNamedQuery(OrderAggregate.class, "total.amount") - .where().gt("order.id", 0).having().gt("totalAmount", 50).findList(); - - for (OrderAggregate r1 : list) { - Assert.assertTrue(r1.getTotalAmount() > 20.50); - // partial object query without totalItems - // ... no lazy loading invoked on this type of bean - Assert.assertTrue(r1.getTotalItems() == null); - } - - List l2 = Ebean.createQuery(OrderAggregate.class).where().gt("order.id", 0) + List l2 = Ebean.createQuery(OrderAggregate.class) + .setRawSql(rawSql) + .where().gt("order.id", 0) .having().lt("totalItems", 3).gt("totalAmount", 50).findList(); for (OrderAggregate r2 : l2) { diff --git a/src/test/java/com/avaje/tests/basic/TestQueryParse.java b/src/test/java/com/avaje/tests/basic/TestQueryParse.java deleted file mode 100644 index 1431f5082..000000000 --- a/src/test/java/com/avaje/tests/basic/TestQueryParse.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.avaje.tests.basic; - -import org.junit.Assert; -import org.junit.Test; - -import com.avaje.ebean.BaseTestCase; -import com.avaje.ebean.Ebean; -import com.avaje.ebean.OrderBy; -import com.avaje.ebean.Query; -import com.avaje.tests.model.basic.Order; -import com.avaje.tests.model.basic.ResetBasicData; - -public class TestQueryParse extends BaseTestCase { - - @Test - public void test() { - //GlobalProperties.put("ebean.ddl.generate", "false"); - //GlobalProperties.put("ebean.ddl.run", "false"); - ResetBasicData.reset(); - - String oql = "where 1=1 order by customer.name desc, status"; - Query query = Ebean.createQuery(Order.class, oql); - - OrderBy order = query.order(); - Assert.assertTrue(order.getProperties().size() == 2); - Assert.assertEquals("customer.name",order.getProperties().get(0).getProperty()); - Assert.assertFalse(order.getProperties().get(0).isAscending()); - Assert.assertEquals("status",order.getProperties().get(1).getProperty()); - Assert.assertTrue(order.getProperties().get(1).isAscending()); - } - -} diff --git a/src/test/java/com/avaje/tests/basic/encrypt/TestEncrypt.java b/src/test/java/com/avaje/tests/basic/encrypt/TestEncrypt.java index 35ffd93b7..6d685fa1a 100644 --- a/src/test/java/com/avaje/tests/basic/encrypt/TestEncrypt.java +++ b/src/test/java/com/avaje/tests/basic/encrypt/TestEncrypt.java @@ -56,18 +56,6 @@ public class TestEncrypt extends BaseTestCase { Date earlyDob = new Date(System.currentTimeMillis() - 500000); - List qlList = Ebean - .createQuery(EBasicEncrypt.class, "where description like :d and dob >= :dob") - .setParameter("d", "testde%").setParameter("dob", earlyDob).findList(); - - Assert.assertTrue(qlList.size() > 0); - - qlList = Ebean - .createQuery(EBasicEncrypt.class, "find e (id, description) where description = :d") - .setParameter("d", "testdesc").findList(); - - Assert.assertTrue(qlList.size() == 1); - SqlQuery q = Ebean.createSqlQuery("select * from e_basicenc where id = :id"); q.setParameter("id", e.getId()); @@ -105,11 +93,6 @@ public class TestEncrypt extends BaseTestCase { list = Ebean.find(EBasicEncrypt.class).where().startsWith("description", "modde").findList(); Assert.assertEquals(1, list.size()); - - list = Ebean.createQuery(EBasicEncrypt.class, "where description like :d") - .setParameter("d", "modde%").findList(); - - Assert.assertNotNull(list); } } diff --git a/src/test/java/com/avaje/tests/batchload/TestLazyJoin2.java b/src/test/java/com/avaje/tests/batchload/TestLazyJoin2.java index 64ad56330..b4c027763 100644 --- a/src/test/java/com/avaje/tests/batchload/TestLazyJoin2.java +++ b/src/test/java/com/avaje/tests/batchload/TestLazyJoin2.java @@ -71,19 +71,6 @@ public class TestLazyJoin2 extends BaseTestCase { String name = customer2.getName(); Assert.assertNotNull(name); - String q = "find order join customer (+query(1) +lazy(10) name, status) join customer.contacts "; - Query query = Ebean.createQuery(Order.class, q); - - List list3 = query.findList(); - Order order3 = list3.get(0); - String n3 = order3.getCustomer().getName(); - - for (Order o3 : list3) { - o3.getCustomer().getName(); - } - - Assert.assertNotNull(n3); - } } diff --git a/src/test/java/com/avaje/tests/delete/TestDeleteByQuery.java b/src/test/java/com/avaje/tests/delete/TestDeleteByQuery.java index e3af951a6..e199dfe0b 100644 --- a/src/test/java/com/avaje/tests/delete/TestDeleteByQuery.java +++ b/src/test/java/com/avaje/tests/delete/TestDeleteByQuery.java @@ -66,20 +66,6 @@ public class TestDeleteByQuery extends BaseTestCase { assertThat(sql.get(0)).contains("delete from o_customer where name = ?"); } - @Test - public void delete_queryString() { - - LoggedSqlCollector.start(); - - Ebean.createQuery(Customer.class, "where name = :name") - .setParameter("name","Don Roberto") - .delete(); - - List sql = LoggedSqlCollector.stop(); - assertThat(sql).hasSize(1); - assertThat(sql.get(0)).contains("delete from o_customer where name = ?"); - } - @Test public void testCommit() { diff --git a/src/test/java/com/avaje/tests/inheritance/TestInheritanceJoins.java b/src/test/java/com/avaje/tests/inheritance/TestInheritanceJoins.java index 1b39a520f..a09f3d3b3 100644 --- a/src/test/java/com/avaje/tests/inheritance/TestInheritanceJoins.java +++ b/src/test/java/com/avaje/tests/inheritance/TestInheritanceJoins.java @@ -34,14 +34,6 @@ public class TestInheritanceJoins extends BaseTestCase { r.setProductConfiguration(pc); r.setGroupConfiguration(gc); server.save(r); - - - Query q = server.createNamedQuery(CalculationResult.class, "loadResult"); - q.setParameter("charge", 100.0); - - List results = q.findList(); - - Assert.assertTrue(!results.isEmpty()); } @Test @@ -84,14 +76,6 @@ public class TestInheritanceJoins extends BaseTestCase { r.setProductConfiguration(pc); r.setGroupConfiguration(null); server.save(r); - - - Query q = server.createNamedQuery(CalculationResult.class, "loadResult"); - q.setParameter("charge", charge); - - List results = q.findList(); - - Assert.assertTrue(!results.isEmpty()); } @Test diff --git a/src/test/java/com/avaje/tests/query/TestInCollectionQueryPlan.java b/src/test/java/com/avaje/tests/query/TestInCollectionQueryPlan.java deleted file mode 100644 index 75b4cca63..000000000 --- a/src/test/java/com/avaje/tests/query/TestInCollectionQueryPlan.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.avaje.tests.query; - -import java.util.ArrayList; -import java.util.List; - -import org.junit.Test; - -import com.avaje.ebean.BaseTestCase; -import com.avaje.ebean.Ebean; -import com.avaje.tests.model.basic.Customer; -import com.avaje.tests.model.basic.ResetBasicData; - -public class TestInCollectionQueryPlan extends BaseTestCase { - - @Test - public void test() { - - ResetBasicData.reset(); - - List idList1 = new ArrayList(); - idList1.add(1); - - String oq = "find customer where id in (:idList)"; - Ebean.createQuery(Customer.class, oq).setParameter("idList", idList1).findList(); - - List idList2 = new ArrayList(); - idList2.add(1); - idList2.add(2); - - Ebean.createQuery(Customer.class, oq).setParameter("idList", idList2).findList(); - - } -} diff --git a/src/test/java/com/avaje/tests/query/TestMyAdHocSqlSelect.java b/src/test/java/com/avaje/tests/query/TestMyAdHocSqlSelect.java index 108f19b8c..a87a88a17 100644 --- a/src/test/java/com/avaje/tests/query/TestMyAdHocSqlSelect.java +++ b/src/test/java/com/avaje/tests/query/TestMyAdHocSqlSelect.java @@ -2,6 +2,8 @@ package com.avaje.tests.query; import java.util.List; +import com.avaje.ebean.RawSql; +import com.avaje.ebean.RawSqlBuilder; import org.junit.Assert; import org.junit.Test; @@ -17,7 +19,10 @@ public class TestMyAdHocSqlSelect extends BaseTestCase { ResetBasicData.reset(); - List list = Ebean.find(MyAdHoc.class).where().gt("order_id", 0).having() + String sql = "select order_id, count(*) as detailCount from o_order_detail group by order_id"; + RawSql rawSql = RawSqlBuilder.parse(sql).columnMapping("order_id", "order.id").create(); + + List list = Ebean.find(MyAdHoc.class).setRawSql(rawSql).where().gt("order_id", 0).having() .gt("detailCount", 0).findList(); Assert.assertNotNull(list); diff --git a/src/test/java/com/avaje/tests/query/TestNoSpaceBracket.java b/src/test/java/com/avaje/tests/query/TestNoSpaceBracket.java deleted file mode 100644 index 2b32118b1..000000000 --- a/src/test/java/com/avaje/tests/query/TestNoSpaceBracket.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.avaje.tests.query; - -import org.junit.Test; - -import com.avaje.ebean.BaseTestCase; -import com.avaje.ebean.Ebean; -import com.avaje.ebean.Query; -import com.avaje.tests.model.basic.Order; - -public class TestNoSpaceBracket extends BaseTestCase { - - @Test - public void test() { - - Query query = Ebean.createQuery(Order.class, "find order join customer(id,name) "); - - query.findList(); - - } - -} diff --git a/src/test/java/com/avaje/tests/query/TestQueryLimitOffsetSimple.java b/src/test/java/com/avaje/tests/query/TestQueryLimitOffsetSimple.java deleted file mode 100644 index cf9302dfc..000000000 --- a/src/test/java/com/avaje/tests/query/TestQueryLimitOffsetSimple.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.avaje.tests.query; - -import org.junit.Test; - -import com.avaje.ebean.BaseTestCase; -import com.avaje.ebean.Ebean; -import com.avaje.ebean.Query; -import com.avaje.tests.model.basic.Order; -import com.avaje.tests.model.basic.ResetBasicData; - -public class TestQueryLimitOffsetSimple extends BaseTestCase { - - /** - * Test the syntax of the limit offset clause. - */ - @Test - public void testMe() { - - ResetBasicData.reset(); - - Query query = Ebean.createQuery(Order.class, "where status = :A limit 100 offset 3"); - query.setParameter("A", Order.Status.NEW); - - query - .setFirstRow(10) - .order().asc("id") - .findList(); - - } - -} diff --git a/src/test/java/com/avaje/tests/query/TestQueryParsing.java b/src/test/java/com/avaje/tests/query/TestQueryParsing.java deleted file mode 100644 index 626dec929..000000000 --- a/src/test/java/com/avaje/tests/query/TestQueryParsing.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.avaje.tests.query; - -import com.avaje.ebean.BaseTestCase; -import com.avaje.ebean.Ebean; -import com.avaje.ebean.Query; -import com.avaje.ebeaninternal.api.SpiQuery; -import com.avaje.ebeaninternal.server.querydefn.OrmQueryDetail; -import com.avaje.tests.model.basic.Order; -import org.junit.Test; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; - -public class TestQueryParsing extends BaseTestCase { - - @Test - public void test() { - - String oq = "find order join customer (id, name) join customer.contacts join details (+query(4),+lazy(5))"; - Query q = Ebean.createQuery(Order.class, oq); - checkQuery(q); - - String oq1 = "find order join customer (id, name) join customer.contacts join details ( +query(4), +lazy(5) )"; - SpiQuery q1 = (SpiQuery) Ebean.createQuery(Order.class, oq1); - checkQuery(q1); - - String oq2 = "find order join customer (id, name) join customer.contacts join details ( +query(4), +lazy(5) , *)"; - SpiQuery q2 = (SpiQuery) Ebean.createQuery(Order.class, oq2); - checkQuery(q2); - - String oq3 = "find order join customer (id, name) join customer.contacts join details (+query(4),+lazy(5),*)"; - SpiQuery q3 = (SpiQuery) Ebean.createQuery(Order.class, oq3); - checkQuery(q3); - - String oq4 = "find order join customer (id, name) join customer.contacts join details (+query(4) +lazy(5) *)"; - SpiQuery q4 = (SpiQuery) Ebean.createQuery(Order.class, oq4); - checkQuery(q4); - - } - - private void checkQuery(Query q) { - - SpiQuery sq = (SpiQuery) q; - OrmQueryDetail detail = sq.getDetail(); - assertTrue(detail.getChunk(null, false).allProperties()); - - assertNotNull(detail.getChunk("customer", false)); - assertFalse(detail.getChunk("customer", false).isQueryFetch()); - assertFalse(detail.getChunk("customer", false).isLazyFetch()); - assertFalse(detail.getChunk("customer", false).allProperties()); - assertEquals("id, name",detail.getChunk("customer", false).getProperties()); - - assertNotNull(detail.getChunk("customer.contacts", false)); - assertFalse(detail.getChunk("customer.contacts", false).isQueryFetch()); - assertFalse(detail.getChunk("customer.contacts", false).isLazyFetch()); - assertTrue(detail.getChunk("customer.contacts", false).allProperties()); - - assertNotNull(detail.getChunk("details", false)); - assertTrue(detail.getChunk("details", false).isQueryFetch()); - assertTrue(detail.getChunk("details", false).isLazyFetch()); - assertEquals(4, detail.getChunk("details", false).getQueryFetchBatch()); - assertEquals(5, detail.getChunk("details", false).getLazyFetchBatch()); - assertTrue(detail.getChunk("details", false).allProperties()); - - } - -} diff --git a/src/test/java/com/avaje/tests/query/TestSubQuery.java b/src/test/java/com/avaje/tests/query/TestSubQuery.java index 4053e3a82..ec2bfa5d6 100644 --- a/src/test/java/com/avaje/tests/query/TestSubQuery.java +++ b/src/test/java/com/avaje/tests/query/TestSubQuery.java @@ -30,18 +30,7 @@ public class TestSubQuery extends BaseTestCase { Query sq = Ebean.createQuery(Order.class).select("id").where() .in("details.product.id", productIds).query(); - List list = Ebean.find(Order.class).where().in("id", sq).findList(); - - // FIXME: need to clear out old orders.. - // Assert.assertEquals(2,list.size()); - - String oq = " find order (id, status) where id in " - + "(select a.id from o_order a join o_order_detail ad on ad.order_id = a.id where ad.product_id in (:prods)) "; - - Ebean.createQuery(Order.class, oq).setParameter("prods", productIds) - .findList(); - - + Ebean.find(Order.class).where().in("id", sq).findList(); } public void testCompositeKey() { diff --git a/src/test/java/com/avaje/tests/query/orderby/TestOrderByWithFunction.java b/src/test/java/com/avaje/tests/query/orderby/TestOrderByWithFunction.java index ea4d4c151..2858e871a 100644 --- a/src/test/java/com/avaje/tests/query/orderby/TestOrderByWithFunction.java +++ b/src/test/java/com/avaje/tests/query/orderby/TestOrderByWithFunction.java @@ -24,12 +24,5 @@ public class TestOrderByWithFunction extends BaseTestCase { String sql = query.getGeneratedSql(); Assert.assertTrue(sql.contains("order by length(t0.name)")); - - String oq = "find customer ORDER BY LENGTH(name),name"; - query = Ebean.createQuery(Customer.class, oq); - query.findList(); - - sql = query.getGeneratedSql(); - Assert.assertTrue(sql.contains("order by LENGTH(t0.name)")); } } diff --git a/src/test/java/com/avaje/tests/query/other/TestQueryConversationRowCount.java b/src/test/java/com/avaje/tests/query/other/TestQueryConversationRowCount.java index 57d8a946f..f76397580 100644 --- a/src/test/java/com/avaje/tests/query/other/TestQueryConversationRowCount.java +++ b/src/test/java/com/avaje/tests/query/other/TestQueryConversationRowCount.java @@ -63,63 +63,5 @@ public class TestQueryConversationRowCount extends BaseTestCase { Assert.assertTrue(countSql.contains("select count(*) from ( select distinct t0.id c0 from c_conversation t0 left outer join c_participation u1 on u1.conversation_id = t0.id where t0.group_id = ? and ((t0.isopen = ? and u1.user_id = ? ) or t0.isopen = ? )")); } - - @Test - public void testUsingQueryLanguage() { - - //"find conversation where club = :clubId and ( ( isPublic = :false and participants.user.id = :userId ) or isPublic = :true ) order by createdAt desc "; - String qry = "find conversation where group.id = :groupId and ( ( open = :false and participants.user.id = :userId ) or open = :true ) order by whenCreated desc "; - - Long groupId = 1L; - Long userId = 1L; - - Query query = Ebean.createQuery(Conversation.class, qry); - query.setParameter("groupId", groupId); - query.setParameter("userId", userId); - query.setParameter("false", false); - query.setParameter("true", true); - - query.findList(); - String generatedSql = query.getGeneratedSql(); - - // ACTUAL: - // select distinct t0.id c0, t0.title c1, t0.open c2, t0.version c3, t0.when_created c4, t0.when_updated c5, t0.group_id c6, t0.when_created - // from c_conversation t0 - // join c_participation t1 on t1.conversation_id = t0.id - // where t0.group_id = ? and ( ( t0.open = ? and t1.user_id = ? ) or t0.open = ? ) - // order by t0.when_created desc; --bind(1, false, 1, true, ) - - // SHOULD BE: - // select distinct t0.id c0, t0.title c1, t0.open c2, t0.version c3, t0.when_created c4, t0.when_updated c5, t0.group_id c6, t0.when_created - // from c_conversation t0 - // left outer join c_participation u1 on u1.conversation_id = t0.id - // where t0.group_id = ? and ((t0.open = ? and u1.user_id = ? ) or t0.open = ? ) - // order by t0.when_created desc; - Assert.assertTrue(generatedSql.contains("select distinct t0.id c0, t0.title c1, t0.isopen")); - - - // THE NEXT ASSERT CURRENTLY FAILS: -// Assert.assertTrue(generatedSql.contains("left outer join c_participation u1 on u1.conversation_id = t0.id")); -// Assert.assertTrue(generatedSql.contains("where t0.group_id = ? and ((t0.open = ? and u1.user_id = ? ) or t0.open = ? )")); -// -// -// LoggedSqlCollector.start(); -// query.findRowCount(); -// -// // select count(*) from ( -// // select distinct t0.id c0 -// // from c_conversation t0 -// // left outer join c_participation u1 on u1.conversation_id = t0.id -// // where t0.group_id = ? and ((t0.open = ? and u1.user_id = ? ) or t0.open = ? ) -// // ); --bind(1,true,1,true) -// -// List loggedSql = LoggedSqlCollector.stop(); -// Assert.assertEquals(1, loggedSql.size()); -// -// String countSql = loggedSql.get(0); -// -// Assert.assertTrue(countSql.contains("select count(*) from ( select distinct t0.id c0 from c_conversation t0 left outer join c_participation u1 on u1.conversation_id = t0.id where t0.group_id = ? and ((t0.open = ? and u1.user_id = ? ) or t0.open = ? )")); - } - } diff --git a/src/test/java/com/avaje/tests/rawsql/TestOrderReportTotal.java b/src/test/java/com/avaje/tests/rawsql/TestOrderReportTotal.java index 04953d917..5f7b53bef 100644 --- a/src/test/java/com/avaje/tests/rawsql/TestOrderReportTotal.java +++ b/src/test/java/com/avaje/tests/rawsql/TestOrderReportTotal.java @@ -3,6 +3,8 @@ package com.avaje.tests.rawsql; import com.avaje.ebean.BaseTestCase; import com.avaje.ebean.Ebean; import com.avaje.ebean.Query; +import com.avaje.ebean.RawSql; +import com.avaje.ebean.RawSqlBuilder; import com.avaje.tests.model.basic.OrderAggregate; import com.avaje.tests.model.basic.OrderDetail; import com.avaje.tests.model.basic.ResetBasicData; @@ -20,12 +22,14 @@ public class TestOrderReportTotal extends BaseTestCase { ResetBasicData.reset(); + RawSql rawSql = getRawSql(); + Query query = Ebean.createQuery(OrderAggregate.class); - List list = query.findList(); + List list = query.setRawSql(rawSql).findList(); assertNotNull(list); - Query q2 = Ebean.createQuery(OrderAggregate.class); + Query q2 = Ebean.createQuery(OrderAggregate.class).setRawSql(rawSql); q2.where().gt("id", 1); q2.having().gt("totalItems", 1); @@ -34,6 +38,15 @@ public class TestOrderReportTotal extends BaseTestCase { } + private RawSql getRawSql() { + String sql = + "select order_id, count(*) as totalItems, sum(order_qty*unit_price) as totalAmount \n" + + "from o_order_detail \n" + + "group by order_id"; + + return RawSqlBuilder.parse(sql).columnMapping("order_id", "order.id").create(); + } + @Test public void testOrderDetailCount() { diff --git a/src/test/java/com/avaje/tests/rawsql/named/TestRawSqlNamedQuery.java b/src/test/java/com/avaje/tests/rawsql/named/TestRawSqlNamedQuery.java deleted file mode 100644 index 63858286f..000000000 --- a/src/test/java/com/avaje/tests/rawsql/named/TestRawSqlNamedQuery.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.avaje.tests.rawsql.named; - -import org.junit.Test; - -import com.avaje.ebean.BaseTestCase; -import com.avaje.ebean.Ebean; -import com.avaje.ebean.FetchConfig; -import com.avaje.ebean.Query; -import com.avaje.tests.model.basic.OrderAggregate; -import com.avaje.tests.model.basic.ResetBasicData; - -public class TestRawSqlNamedQuery extends BaseTestCase { - - @Test - public void test() { - - ResetBasicData.reset(); - - Query q = Ebean.createNamedQuery(OrderAggregate.class, "total.amount"); - q.fetch("order", new FetchConfig().query()); - - q.findList(); - } - -} diff --git a/src/test/java/com/avaje/tests/text/xml/TestDnodeXmlParser.java b/src/test/java/com/avaje/tests/text/xml/TestDnodeXmlParser.java deleted file mode 100644 index 15e715b82..000000000 --- a/src/test/java/com/avaje/tests/text/xml/TestDnodeXmlParser.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.avaje.tests.text.xml; - -import org.junit.Assert; -import org.junit.Test; - -import com.avaje.ebean.BaseTestCase; -import com.avaje.ebeaninternal.server.lib.util.Dnode; -import com.avaje.ebeaninternal.server.lib.util.DnodeReader; - -public class TestDnodeXmlParser extends BaseTestCase { - - @Test - public void testSimple() { - - String xmlString = "

heading

paragraph

"; - - DnodeReader r = new DnodeReader(); - Dnode n = r.parseXml(xmlString); - - String convertedTo = n.toXml(); - - Assert.assertEquals(xmlString, convertedTo); - - } - -} diff --git a/src/test/java/com/avaje/tests/unitinternal/TestXmlConfigLoader.java b/src/test/java/com/avaje/tests/unitinternal/TestXmlConfigLoader.java deleted file mode 100644 index 0d9442c5c..000000000 --- a/src/test/java/com/avaje/tests/unitinternal/TestXmlConfigLoader.java +++ /dev/null @@ -1,91 +0,0 @@ -package com.avaje.tests.unitinternal; - -import com.avaje.ebean.BaseTestCase; -import com.avaje.ebeaninternal.server.core.XmlConfigLoader; -import com.avaje.ebeaninternal.server.lib.util.Dnode; -import org.apache.commons.io.IOUtils; -import org.junit.Assert; -import org.junit.Test; - -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.net.URL; -import java.net.URLClassLoader; -import java.util.List; -import java.util.jar.JarEntry; -import java.util.jar.JarOutputStream; - -/** - * Tests basic xml loading functionality across multiple jars and inside our own test structure. - * - * @author Rob Bygrave - * @author Richard Vowles - http://plus.google.com/RichardVowles - */ -public class TestXmlConfigLoader extends BaseTestCase { - - @Test - public void test() { - - XmlConfigLoader xmlConfigLoader = new XmlConfigLoader(null); - - List ebeanOrmXml = xmlConfigLoader.search(META_INF_EBEAN_ORM_XML); - - Assert.assertNotNull(ebeanOrmXml); - Assert.assertTrue("Found ebean-orm.xml", ebeanOrmXml.size() > 0); - - } - - private static final String META_INF_EBEAN_ORM_XML = "META-INF/ebean-orm.xml"; - private static final String META_INF_ORM_XML = "META-INF/orm.xml"; - private static final String WEB_INF_CLASSES = "WEB-INF/classes/"; - - @Test - public void ensureEbeanOrmStillLoads() throws IOException { - URL jar = setupJar(); - URL jarBang = setupJarBang(); - - URLClassLoader cl = new URLClassLoader(new URL[] { jar, jarBang}, getClass().getClassLoader()); - - XmlConfigLoader loader = new XmlConfigLoader(cl); - - Assert.assertEquals(3, loader.search(META_INF_EBEAN_ORM_XML).size()); // 1 in parent, 2 in ours - Assert.assertEquals(2, loader.search(META_INF_ORM_XML).size()); // 2 in ours - - } - - private URL createJar(File jarFile, String offset) throws IOException { - FileOutputStream stream = new FileOutputStream(jarFile); - JarOutputStream jarOutputStream = new JarOutputStream(stream); - - JarEntry entry = new JarEntry(offset + META_INF_EBEAN_ORM_XML); - jarOutputStream.putNextEntry(entry); - InputStream classStream = getClass().getResourceAsStream("/" + META_INF_EBEAN_ORM_XML); - IOUtils.copy(classStream, jarOutputStream); - - entry = new JarEntry(offset + META_INF_ORM_XML); - jarOutputStream.putNextEntry(entry); - classStream = getClass().getResourceAsStream("/" + META_INF_EBEAN_ORM_XML); - IOUtils.copy(classStream, jarOutputStream); - - jarOutputStream.close(); - stream.close(); - - if (offset.length() > 0) { - return new URL("jar:" + jarFile.toURI().toString() + "!/" + offset); - } else { - return jarFile.toURI().toURL(); - } - } - - private URL setupJarBang() throws IOException { - File jarFile = File.createTempFile("bang", ".war"); - return createJar(jarFile, WEB_INF_CLASSES); - } - - private URL setupJar() throws IOException { - File jarFile = File.createTempFile("nobang", ".jar"); - return createJar(jarFile, ""); - } -}