From 71798afadd8b00bf6d8371aaf2fff34037c2d677 Mon Sep 17 00:00:00 2001 From: Robin Bygrave Date: Fri, 24 Jul 2015 16:52:58 +1200 Subject: [PATCH] #350 - ENH: Add @History findVersions() query - add default ordering to lower sys period desc --- .../server/query/CQueryBuilder.java | 18 ++++---------- .../server/query/CQueryEngine.java | 24 ++++++++++++++++++- .../server/query/CQueryHistorySupport.java | 14 +++++++---- 3 files changed, 36 insertions(+), 20 deletions(-) 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 2c7b7a079..e70a3b9e8 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/query/CQueryBuilder.java +++ b/src/main/java/com/avaje/ebeaninternal/server/query/CQueryBuilder.java @@ -46,10 +46,6 @@ public class CQueryBuilder implements Constants { private final boolean selectCountWithAlias; - private final Map asOfTableMapping; - - private final String asOfSysPeriod; - private final DbHistorySupport dbHistorySupport; private final CQueryHistorySupport historySupport; private final DatabasePlatform dbPlatform; @@ -57,23 +53,17 @@ public class CQueryBuilder implements Constants { /** * Create the SqlGenSelect. */ - public CQueryBuilder(DatabasePlatform dbPlatform, Binder binder, Map asOfTableMapping, String asOfSysPeriod) { + public CQueryBuilder(DatabasePlatform dbPlatform, Binder binder, CQueryHistorySupport historySupport) { + this.dbPlatform = dbPlatform; this.binder = binder; - this.asOfTableMapping = asOfTableMapping; - this.asOfSysPeriod = asOfSysPeriod; + this.historySupport = historySupport; this.tableAliasPlaceHolder = dbPlatform.getTableAliasPlaceHolder(); this.columnAliasPrefix = dbPlatform.getColumnAliasPrefix(); this.sqlSelectBuilder = new RawSqlSelectClauseBuilder(dbPlatform, binder); - - this.dbHistorySupport = dbPlatform.getHistorySupport(); - this.historySupport = new CQueryHistorySupport(dbHistorySupport, asOfTableMapping, asOfSysPeriod); this.sqlLimiter = dbPlatform.getSqlLimiter(); this.rawSqlHandler = new CQueryBuilderRawSql(sqlLimiter, dbPlatform); - this.selectCountWithAlias = dbPlatform.isSelectCountWithAlias(); - - this.dbPlatform = dbPlatform; } /** @@ -427,7 +417,7 @@ public class CQueryBuilder implements Constants { if (i > 0) { sb.append(" and "); } - sb.append(dbHistorySupport.getAsOfPredicate(asOfTableAlias.get(i), asOfSysPeriod)); + sb.append(historySupport.getAsOfPredicate(asOfTableAlias.get(i))); } } 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 def49554f..bed71fc76 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/query/CQueryEngine.java +++ b/src/main/java/com/avaje/ebeaninternal/server/query/CQueryEngine.java @@ -30,13 +30,18 @@ public class CQueryEngine { private static final int defaultSecondaryQueryBatchSize = 100; + private static final String T0 = "t0"; + private final boolean forwardOnlyHintOnFindIterate; private final CQueryBuilder queryBuilder; + private final CQueryHistorySupport historySupport; + public CQueryEngine(DatabasePlatform dbPlatform, Binder binder, Map asOfTableMapping, String asOfSysPeriod) { this.forwardOnlyHintOnFindIterate = dbPlatform.isForwardOnlyHintOnFindIterate(); - this.queryBuilder = new CQueryBuilder(dbPlatform, binder, asOfTableMapping, asOfSysPeriod); + this.historySupport = new CQueryHistorySupport(dbPlatform.getHistorySupport(), asOfTableMapping, asOfSysPeriod); + this.queryBuilder = new CQueryBuilder(dbPlatform, binder, historySupport); } public CQuery buildQuery(OrmQueryRequest request) { @@ -161,6 +166,12 @@ public class CQueryEngine { */ public List> findVersions(OrmQueryRequest request) { + SpiQuery query = request.getQuery(); + + // order by id asc, lower sys period desc + query.orderBy().asc(request.getBeanDescriptor().getIdProperty().getName()); + query.orderBy().desc(getSysPeriodLower(query)); + CQuery cquery = queryBuilder.buildQuery(request); try { cquery.prepareBindExecuteQuery(); @@ -185,6 +196,17 @@ public class CQueryEngine { } } + /** + * Return the lower sys_period given the table alias of the query or default. + */ + private String getSysPeriodLower(SpiQuery query) { + String rootTableAlias = query.getAlias(); + if (rootTableAlias == null) { + rootTableAlias = T0; + } + return historySupport.getSysPeriodLower(rootTableAlias); + } + /** * Find a list/map/set of beans. */ diff --git a/src/main/java/com/avaje/ebeaninternal/server/query/CQueryHistorySupport.java b/src/main/java/com/avaje/ebeaninternal/server/query/CQueryHistorySupport.java index 436892c65..20e0cb608 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/query/CQueryHistorySupport.java +++ b/src/main/java/com/avaje/ebeaninternal/server/query/CQueryHistorySupport.java @@ -22,12 +22,12 @@ public class CQueryHistorySupport { /** * The sys period column. */ - private final String asOfSysPeriod; + private final String sysPeriod; - public CQueryHistorySupport(DbHistorySupport dbHistorySupport, Map asOfTableMap, String asOfSysPeriod) { + public CQueryHistorySupport(DbHistorySupport dbHistorySupport, Map asOfTableMap, String sysPeriod) { this.dbHistorySupport = dbHistorySupport; this.asOfTableMap = asOfTableMap; - this.asOfSysPeriod = asOfSysPeriod; + this.sysPeriod = sysPeriod; } public String getAsOfView(String table) { @@ -36,12 +36,16 @@ public class CQueryHistorySupport { public String getSysPeriodLower(String tableAlias) { - return dbHistorySupport.getSysPeriodLower(tableAlias, asOfSysPeriod); + return dbHistorySupport.getSysPeriodLower(tableAlias, sysPeriod); } public String getSysPeriodUpper(String tableAlias) { - return dbHistorySupport.getSysPeriodUpper(tableAlias, asOfSysPeriod); + return dbHistorySupport.getSysPeriodUpper(tableAlias, sysPeriod); } + public String getAsOfPredicate(String tableAlias) { + + return dbHistorySupport.getAsOfPredicate(tableAlias, sysPeriod); + } }