diff --git a/li.strolch.agent/src/main/java/li/strolch/persistence/api/OrderDao.java b/li.strolch.agent/src/main/java/li/strolch/persistence/api/OrderDao.java index 5c57f8972..7ce145850 100644 --- a/li.strolch.agent/src/main/java/li/strolch/persistence/api/OrderDao.java +++ b/li.strolch.agent/src/main/java/li/strolch/persistence/api/OrderDao.java @@ -66,13 +66,15 @@ public interface OrderDao extends StrolchDao { * the max amount, or @{@link Integer#MAX_VALUE} for all * @param offset * if max amount defined, then the offset to start from + * @param asc + * true for ascending, false for descending * * @return all elements regardless of type * * @throws StrolchPersistenceException * if something goes wrong */ - List queryAll(DateRange dateRange, long limit, long offset) throws StrolchPersistenceException; + List queryAll(DateRange dateRange, long limit, long offset, boolean asc) throws StrolchPersistenceException; /** * Queries and returns all elements of the given type @@ -100,13 +102,14 @@ public interface OrderDao extends StrolchDao { * if max amount defined, then the offset to start from * @param types * the type(s) of element(s) to return + * @param asc + * true for ascending, false for descending * * @return all elements of the given type * * @throws StrolchPersistenceException * if something goes wrong */ - List queryAll(DateRange dateRange, long limit, long offset, String... types) + List queryAll(DateRange dateRange, long limit, long offset, boolean asc, String... types) throws StrolchPersistenceException; - } diff --git a/li.strolch.agent/src/main/java/li/strolch/persistence/impl/InMemoryOrderDao.java b/li.strolch.agent/src/main/java/li/strolch/persistence/impl/InMemoryOrderDao.java index aba8dd857..eb097d91c 100644 --- a/li.strolch.agent/src/main/java/li/strolch/persistence/impl/InMemoryOrderDao.java +++ b/li.strolch.agent/src/main/java/li/strolch/persistence/impl/InMemoryOrderDao.java @@ -69,7 +69,8 @@ public class InMemoryOrderDao implements OrderDao { } @Override - public List queryAll(DateRange dateRange, long limit, long offset) throws StrolchPersistenceException { + public List queryAll(DateRange dateRange, long limit, long offset, boolean asc) + throws StrolchPersistenceException { return instance.getElements().values().stream().filter(o -> dateRange.contains(o.getDate())).skip(offset) .limit(limit).collect(toList()); } @@ -91,7 +92,7 @@ public class InMemoryOrderDao implements OrderDao { } @Override - public List queryAll(DateRange dateRange, long limit, long offset, String... types) + public List queryAll(DateRange dateRange, long limit, long offset, boolean asc, String... types) throws StrolchPersistenceException { return instance.getElements().values().stream().filter(o -> isIn(o, types)) .filter(o -> dateRange.contains(o.getDate())).skip(offset).limit(limit).collect(toList()); diff --git a/li.strolch.persistence.postgresql/src/main/java/li/strolch/persistence/postgresql/PostgreSqlOrderDao.java b/li.strolch.persistence.postgresql/src/main/java/li/strolch/persistence/postgresql/PostgreSqlOrderDao.java index ea900605a..9b8d78368 100644 --- a/li.strolch.persistence.postgresql/src/main/java/li/strolch/persistence/postgresql/PostgreSqlOrderDao.java +++ b/li.strolch.persistence.postgresql/src/main/java/li/strolch/persistence/postgresql/PostgreSqlOrderDao.java @@ -49,14 +49,14 @@ public class PostgreSqlOrderDao extends PostgresqlDao implements OrderDao private static final String querySizeOfTypeDrSqlS = "select count(*) from {0} where type = ANY(?) and latest = true {1}"; private static final String queryAllDrAsXmlSqlS = "select id, type, asxml from {0} where latest = true {1}"; - private static final String queryAllDrAsXmlLimitSqlS = "select id, type, asxml from {0} where latest = true {1} order by id limit {2} offset {3}"; + private static final String queryAllDrAsXmlLimitSqlS = "select id, type, asxml from {0} where latest = true {1} order by date {2} limit {3} offset {4}"; private static final String queryAllDrAsJsonSqlS = "select id, type, asjson from {0} where latest = true {1}"; - private static final String queryAllDrAsJsonLimitSqlS = "select id, type, asjson from {0} where latest = true {1} order by id limit {2} offset {3}"; + private static final String queryAllDrAsJsonLimitSqlS = "select id, type, asjson from {0} where latest = true {1} order by date {2} limit {3} offset {4}"; private static final String queryAllByTypeDrAsXmlSqlS = "select id, type, asxml from {0} where type = ANY(?) and latest = true {1}"; - private static final String queryAllByTypeDrAsXmlLimitSqlS = "select id, type, asxml from {0} where type = ANY(?) and latest = true {1} order by id limit {2,number,#} offset {3,number,#}"; + private static final String queryAllByTypeDrAsXmlLimitSqlS = "select id, type, asxml from {0} where type = ANY(?) and latest = true {1} order by date {2} limit {3,number,#} offset {4,number,#}"; private static final String queryAllByTypeDrAsJsonSqlS = "select id, type, asjson from {0} where type = ANY(?) and latest = true {1}"; - private static final String queryAllByTypeDrAsJsonLimitSqlS = "select id, type, asjson from {0} where type = ANY(?) and latest = true {1} order by id limit {2,number,#} offset {3,number,#}"; + private static final String queryAllByTypeDrAsJsonLimitSqlS = "select id, type, asjson from {0} where type = ANY(?) and latest = true {1} order by date {2} limit {3,number,#} offset {4,number,#}"; private static final String insertAsXmlSqlS = "insert into {0} (id, version, created_by, created_at, updated_at, deleted, latest, name, type, state, date, asxml) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?::order_state, ?, ?)"; private static final String insertAsJsonSqlS = "insert into {0} (id, version, created_by, created_at, updated_at, deleted, latest, name, type, state, date, asjson) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?::order_state, ?, ?)"; @@ -287,15 +287,16 @@ public class PostgreSqlOrderDao extends PostgresqlDao implements OrderDao @Override public List queryAll(DateRange dateRange) throws StrolchPersistenceException { - return queryAll(dateRange, Integer.MAX_VALUE, 0); + return queryAll(dateRange, Integer.MAX_VALUE, 0, true); } @Override - public List queryAll(DateRange dateRange, long limit, long offset) throws StrolchPersistenceException { + public List queryAll(DateRange dateRange, long limit, long offset, boolean asc) + throws StrolchPersistenceException { List list = new ArrayList<>(); - String sql = getLimitSql(dateRange, limit, offset, queryAllDrAsXmlSqlS, queryAllDrAsJsonSqlS, + String sql = getLimitSql(dateRange, limit, offset, asc, queryAllDrAsXmlSqlS, queryAllDrAsJsonSqlS, queryAllDrAsXmlLimitSqlS, queryAllDrAsJsonLimitSqlS); try (PreparedStatement statement = this.connection.prepareStatement(sql)) { @@ -317,18 +318,18 @@ public class PostgreSqlOrderDao extends PostgresqlDao implements OrderDao @Override public List queryAll(DateRange dateRange, String... types) throws StrolchPersistenceException { - return queryAll(dateRange, Integer.MAX_VALUE, 0, types); + return queryAll(dateRange, Integer.MAX_VALUE, 0, true, types); } @Override - public List queryAll(DateRange dateRange, long limit, long offset, String... types) + public List queryAll(DateRange dateRange, long limit, long offset, boolean asc, String... types) throws StrolchPersistenceException { if (types.length == 0) return queryAll(limit, offset); List list = new ArrayList<>(); - String sql = getLimitSql(dateRange, limit, offset, queryAllByTypeDrAsXmlSqlS, queryAllByTypeDrAsJsonSqlS, + String sql = getLimitSql(dateRange, limit, offset, asc, queryAllByTypeDrAsXmlSqlS, queryAllByTypeDrAsJsonSqlS, queryAllByTypeDrAsXmlLimitSqlS, queryAllByTypeDrAsJsonLimitSqlS); try (PreparedStatement statement = this.connection.prepareStatement(sql)) { @@ -351,13 +352,12 @@ public class PostgreSqlOrderDao extends PostgresqlDao implements OrderDao } } - protected String getLimitSql(DateRange dateRange, long limit, long offset, String xmlSql, String jsonSql, - String xmlLimitSql, String jsonLimitSql) { + protected String getLimitSql(DateRange dateRange, long limit, long offset, boolean asc, String xmlSql, + String jsonSql, String xmlLimitSql, String jsonLimitSql) { String sql; - if (limit == Integer.MAX_VALUE) { + if (limit == Integer.MAX_VALUE) return getSql(dateRange, xmlSql, jsonSql); - } if (this.dataType == DataType.xml) sql = xmlLimitSql; @@ -367,7 +367,7 @@ public class PostgreSqlOrderDao extends PostgresqlDao implements OrderDao throw new IllegalStateException("Unhandled DataType " + this.dataType); String dateRangeClause = buildDateRangeClaus(dateRange); - return MessageFormat.format(sql, getTableName(), dateRangeClause, limit, offset); + return MessageFormat.format(sql, getTableName(), dateRangeClause, asc ? "ASC" : "DESC", limit, offset); } protected String getSql(DateRange dateRange, String xmlSql, String jsonSql) { diff --git a/li.strolch.persistence.xml/src/main/java/li/strolch/persistence/xml/XmlOrderDao.java b/li.strolch.persistence.xml/src/main/java/li/strolch/persistence/xml/XmlOrderDao.java index dd0fb96d4..8c1a64beb 100644 --- a/li.strolch.persistence.xml/src/main/java/li/strolch/persistence/xml/XmlOrderDao.java +++ b/li.strolch.persistence.xml/src/main/java/li/strolch/persistence/xml/XmlOrderDao.java @@ -114,7 +114,8 @@ public class XmlOrderDao extends AbstractDao implements OrderDao { } @Override - public List queryAll(DateRange dateRange, long limit, long offset) throws StrolchPersistenceException { + public List queryAll(DateRange dateRange, long limit, long offset, boolean asc) + throws StrolchPersistenceException { throw new UnsupportedOperationException("Paging not supported! Check first with supportsPaging()"); } @@ -124,7 +125,7 @@ public class XmlOrderDao extends AbstractDao implements OrderDao { } @Override - public List queryAll(DateRange dateRange, long limit, long offset, String... types) + public List queryAll(DateRange dateRange, long limit, long offset, boolean asc, String... types) throws StrolchPersistenceException { throw new UnsupportedOperationException("Paging not supported! Check first with supportsPaging()"); } diff --git a/li.strolch.testbase/src/main/java/li/strolch/testbase/runtime/OrderModelTestRunner.java b/li.strolch.testbase/src/main/java/li/strolch/testbase/runtime/OrderModelTestRunner.java index 54f8b0f51..d04fbbc47 100644 --- a/li.strolch.testbase/src/main/java/li/strolch/testbase/runtime/OrderModelTestRunner.java +++ b/li.strolch.testbase/src/main/java/li/strolch/testbase/runtime/OrderModelTestRunner.java @@ -160,11 +160,11 @@ public class OrderModelTestRunner { assertEquals("Expect 2 Orders from _2017 inc to _20190401 inc", 2, orders.size()); if (dao.supportsPaging()) { - orders = dao.queryAll(dateRange, 2, 1); + orders = dao.queryAll(dateRange, 2, 1, true); assertEquals("Expect 1 Orders from _2017 inc to _20190401 inc offset 1 limit 2", 1, orders.size()); assertEquals("Expect order myTestOrder2", "myTestOrder2", orders.get(0).getId()); - orders = dao.queryAll(new DateRange().from(_2017, true).to(_2020, true), 2, 1); + orders = dao.queryAll(new DateRange().from(_2017, true).to(_2020, true), 2, 1, true); assertEquals("Expect 2 Orders from _2017 inc to _2020 inc offset 1 limit 2", 2, orders.size()); assertEquals("Expect order myTestOrder2", "myTestOrder2", orders.get(0).getId()); assertEquals("Expect order myTestOrder3", "myTestOrder3", orders.get(1).getId());