[Major] Added ordering to OrderDao.queryAll() with asc/desc

This commit is contained in:
Robert von Burg 2021-01-25 21:52:17 +01:00
parent 648a47890c
commit 42b54b3da3
5 changed files with 29 additions and 24 deletions

View File

@ -66,13 +66,15 @@ public interface OrderDao extends StrolchDao<Order> {
* 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<Order> queryAll(DateRange dateRange, long limit, long offset) throws StrolchPersistenceException;
List<Order> 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<Order> {
* 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<Order> queryAll(DateRange dateRange, long limit, long offset, String... types)
List<Order> queryAll(DateRange dateRange, long limit, long offset, boolean asc, String... types)
throws StrolchPersistenceException;
}

View File

@ -69,7 +69,8 @@ public class InMemoryOrderDao implements OrderDao {
}
@Override
public List<Order> queryAll(DateRange dateRange, long limit, long offset) throws StrolchPersistenceException {
public List<Order> 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<Order> queryAll(DateRange dateRange, long limit, long offset, String... types)
public List<Order> 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());

View File

@ -49,14 +49,14 @@ public class PostgreSqlOrderDao extends PostgresqlDao<Order> 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<Order> implements OrderDao
@Override
public List<Order> queryAll(DateRange dateRange) throws StrolchPersistenceException {
return queryAll(dateRange, Integer.MAX_VALUE, 0);
return queryAll(dateRange, Integer.MAX_VALUE, 0, true);
}
@Override
public List<Order> queryAll(DateRange dateRange, long limit, long offset) throws StrolchPersistenceException {
public List<Order> queryAll(DateRange dateRange, long limit, long offset, boolean asc)
throws StrolchPersistenceException {
List<Order> 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<Order> implements OrderDao
@Override
public List<Order> 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<Order> queryAll(DateRange dateRange, long limit, long offset, String... types)
public List<Order> queryAll(DateRange dateRange, long limit, long offset, boolean asc, String... types)
throws StrolchPersistenceException {
if (types.length == 0)
return queryAll(limit, offset);
List<Order> 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<Order> 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<Order> 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) {

View File

@ -114,7 +114,8 @@ public class XmlOrderDao extends AbstractDao<Order> implements OrderDao {
}
@Override
public List<Order> queryAll(DateRange dateRange, long limit, long offset) throws StrolchPersistenceException {
public List<Order> 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<Order> implements OrderDao {
}
@Override
public List<Order> queryAll(DateRange dateRange, long limit, long offset, String... types)
public List<Order> queryAll(DateRange dateRange, long limit, long offset, boolean asc, String... types)
throws StrolchPersistenceException {
throw new UnsupportedOperationException("Paging not supported! Check first with supportsPaging()");
}

View File

@ -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());