[Major] Extended StrolchDao with paging feature

This commit is contained in:
Robert von Burg 2019-03-05 17:57:59 +01:00
parent a3264fb99c
commit 45189a5bc3
6 changed files with 209 additions and 130 deletions

View File

@ -39,19 +39,29 @@ import li.strolch.model.StrolchRootElement;
*/ */
public interface StrolchDao<T extends StrolchRootElement> { public interface StrolchDao<T extends StrolchRootElement> {
/**
* Returns true if this {@link StrolchDao} supports paging, i.e. the methods with a limit and offset may be used
*
* @return true if this {@link StrolchDao} supports paging, i.e. the methods with a limit and offset may be used
*/
boolean supportsPaging();
/** /**
* Returns the number of elements in the underlying persistence layer, regardless of type * Returns the number of elements in the underlying persistence layer, regardless of type
* *
* @return the number of elements in the underlying persistence layer * @return the number of elements in the underlying persistence layer
*/ */
public long querySize(); long querySize();
/** /**
* Returns the number of elements in the underlying persistence layer for the given type * Returns the number of elements in the underlying persistence layer for the given type(s)
* *
* @return the number of elements in the underlying persistence layer for the given type * @param types
* the type(s) to query the size for
*
* @return the number of elements in the underlying persistence layer for the given type(s)
*/ */
public long querySize(String type); long querySize(String... types);
/** /**
* Queries the current list of types from the underlying persistence layer * Queries the current list of types from the underlying persistence layer
@ -61,20 +71,62 @@ public interface StrolchDao<T extends StrolchRootElement> {
* @throws StrolchPersistenceException * @throws StrolchPersistenceException
* if something goes wrong * if something goes wrong
*/ */
public Set<String> queryTypes() throws StrolchPersistenceException; Set<String> queryTypes() throws StrolchPersistenceException;
/**
* Queries and returns all elements regardless of type
*
* @return all elements regardless of type
*
* @throws StrolchPersistenceException
* if something goes wrong
*/
List<T> queryAll() throws StrolchPersistenceException;
/**
* Queries and returns all elements regardless of type
*
* @param limit
* the max amount, or @{@link Integer#MAX_VALUE} for all
* @param offset
* if max amount defined, then the offset to start from
*
* @return all elements regardless of type
*
* @throws StrolchPersistenceException
* if something goes wrong
*/
List<T> queryAll(long limit, long offset) throws StrolchPersistenceException;
/** /**
* Queries and returns all elements of the given type * Queries and returns all elements of the given type
* *
* @param type * @param types
* the type of element to return * the type(s) of element(s) to return
* *
* @return all elements of the given type * @return all elements of the given type
* *
* @throws StrolchPersistenceException * @throws StrolchPersistenceException
* if something goes wrong * if something goes wrong
*/ */
public List<T> queryAll(String type) throws StrolchPersistenceException; List<T> queryAll(String... types) throws StrolchPersistenceException;
/**
* Queries and returns all elements of the given type
*
* @param limit
* the max amount, or @{@link Integer#MAX_VALUE} for all
* @param offset
* if max amount defined, then the offset to start from
* @param types
* the type(s) of element(s) to return
*
* @return all elements of the given type
*
* @throws StrolchPersistenceException
* if something goes wrong
*/
List<T> queryAll(long limit, long offset, String... types) throws StrolchPersistenceException;
/** /**
* Persists the given element. The element must not yet exist * Persists the given element. The element must not yet exist
@ -85,7 +137,7 @@ public interface StrolchDao<T extends StrolchRootElement> {
* @throws StrolchPersistenceException * @throws StrolchPersistenceException
* if the element already exists * if the element already exists
*/ */
public void save(T element) throws StrolchPersistenceException; void save(T element) throws StrolchPersistenceException;
/** /**
* Persists the given list of elements. None of the elements may already exists * Persists the given list of elements. None of the elements may already exists
@ -96,7 +148,7 @@ public interface StrolchDao<T extends StrolchRootElement> {
* @throws StrolchPersistenceException * @throws StrolchPersistenceException
* if any of the elements already exist * if any of the elements already exist
*/ */
public void saveAll(List<T> elements) throws StrolchPersistenceException; void saveAll(List<T> elements) throws StrolchPersistenceException;
/** /**
* Updates the given element. The element must already exist * Updates the given element. The element must already exist
@ -107,7 +159,7 @@ public interface StrolchDao<T extends StrolchRootElement> {
* @throws StrolchPersistenceException * @throws StrolchPersistenceException
* if the element does not exist * if the element does not exist
*/ */
public void update(T element) throws StrolchPersistenceException; void update(T element) throws StrolchPersistenceException;
/** /**
* Updates the given list of elements. Each element must already exist * Updates the given list of elements. Each element must already exist
@ -118,7 +170,7 @@ public interface StrolchDao<T extends StrolchRootElement> {
* @throws StrolchPersistenceException * @throws StrolchPersistenceException
* if any of the elements do not exist * if any of the elements do not exist
*/ */
public void updateAll(List<T> elements) throws StrolchPersistenceException; void updateAll(List<T> elements) throws StrolchPersistenceException;
/** /**
* <p> * <p>
@ -136,7 +188,7 @@ public interface StrolchDao<T extends StrolchRootElement> {
* @throws StrolchPersistenceException * @throws StrolchPersistenceException
* if the element does not exist * if the element does not exist
*/ */
public void remove(T element) throws StrolchPersistenceException; void remove(T element) throws StrolchPersistenceException;
/** /**
* <p> * <p>
@ -154,7 +206,7 @@ public interface StrolchDao<T extends StrolchRootElement> {
* @throws StrolchPersistenceException * @throws StrolchPersistenceException
* if any of the elements do not exist * if any of the elements do not exist
*/ */
public void removeAll(List<T> elements) throws StrolchPersistenceException; void removeAll(List<T> elements) throws StrolchPersistenceException;
/** /**
* <p> * <p>
@ -171,7 +223,7 @@ public interface StrolchDao<T extends StrolchRootElement> {
* @throws StrolchPersistenceException * @throws StrolchPersistenceException
* if something goes wrong * if something goes wrong
*/ */
public long removeAll() throws StrolchPersistenceException; long removeAll() throws StrolchPersistenceException;
/** /**
* <p> * <p>
@ -191,7 +243,7 @@ public interface StrolchDao<T extends StrolchRootElement> {
* @throws StrolchPersistenceException * @throws StrolchPersistenceException
* if something goes wrong * if something goes wrong
*/ */
public long removeAllBy(String type) throws StrolchPersistenceException; long removeAllBy(String type) throws StrolchPersistenceException;
/** /**
* <p> * <p>
@ -214,7 +266,7 @@ public interface StrolchDao<T extends StrolchRootElement> {
* @throws StrolchPersistenceException * @throws StrolchPersistenceException
* if something goes wrong * if something goes wrong
*/ */
public T queryBy(String type, String id, int version) throws StrolchPersistenceException; T queryBy(String type, String id, int version) throws StrolchPersistenceException;
/** /**
* Queries and returns all the versions of the element with the given type and ID * Queries and returns all the versions of the element with the given type and ID
@ -229,7 +281,7 @@ public interface StrolchDao<T extends StrolchRootElement> {
* @throws StrolchPersistenceException * @throws StrolchPersistenceException
* if something goes wrong * if something goes wrong
*/ */
public List<T> queryVersionsFor(String type, String id) throws StrolchPersistenceException; List<T> queryVersionsFor(String type, String id) throws StrolchPersistenceException;
/** /**
* Queries and returns the latest version of the element with the given type and ID, -1 if no version available * Queries and returns the latest version of the element with the given type and ID, -1 if no version available
@ -244,7 +296,7 @@ public interface StrolchDao<T extends StrolchRootElement> {
* @throws StrolchPersistenceException * @throws StrolchPersistenceException
* if something goes wrong * if something goes wrong
*/ */
public int queryLatestVersionFor(String type, String id) throws StrolchPersistenceException; int queryLatestVersionFor(String type, String id) throws StrolchPersistenceException;
/** /**
* Queries and returns the number of versions for the element with the given type and ID * Queries and returns the number of versions for the element with the given type and ID
@ -259,17 +311,7 @@ public interface StrolchDao<T extends StrolchRootElement> {
* @throws StrolchPersistenceException * @throws StrolchPersistenceException
* if something goes wrong * if something goes wrong
*/ */
public long queryVersionsSizeFor(String type, String id) throws StrolchPersistenceException; long queryVersionsSizeFor(String type, String id) throws StrolchPersistenceException;
/**
* Queries and returns all elements regardless of type
*
* @return all elements regardless of type
*
* @throws StrolchPersistenceException
* if something goes wrong
*/
public List<T> queryAll() throws StrolchPersistenceException;
/** /**
* <p> * <p>
@ -288,7 +330,7 @@ public interface StrolchDao<T extends StrolchRootElement> {
* @throws StrolchPersistenceException * @throws StrolchPersistenceException
* if the element/version does not exist * if the element/version does not exist
*/ */
public void removeVersion(T element) throws StrolchPersistenceException; void removeVersion(T element) throws StrolchPersistenceException;
/** /**
* Causes the DAO to flush any actions which have not yet been sent to the underlying persistence layer * Causes the DAO to flush any actions which have not yet been sent to the underlying persistence layer
@ -296,5 +338,5 @@ public interface StrolchDao<T extends StrolchRootElement> {
* @throws StrolchPersistenceException * @throws StrolchPersistenceException
* if something goes wrong * if something goes wrong
*/ */
public void flush() throws StrolchPersistenceException; void flush() throws StrolchPersistenceException;
} }

View File

@ -94,14 +94,7 @@ public class PostgreSqlActivityDao extends PostgresqlDao<Activity> implements Ac
@Override @Override
protected void internalSave(final Activity activity) { protected void internalSave(final Activity activity) {
String sql; String sql = getSql(insertAsXmlSqlS, insertAsJsonSqlS);
if (this.dataType == DataType.xml)
sql = insertAsXmlSqlS;
else if (this.dataType == DataType.json)
sql = insertAsJsonSqlS;
else
throw new IllegalStateException("Unhandled DataType " + this.dataType);
sql = MessageFormat.format(sql, getTableName());
try (PreparedStatement preparedStatement = this.connection.prepareStatement(sql)) { try (PreparedStatement preparedStatement = this.connection.prepareStatement(sql)) {
@ -193,14 +186,7 @@ public class PostgreSqlActivityDao extends PostgresqlDao<Activity> implements Ac
activity.getVersion())); activity.getVersion()));
} }
String sql; String sql = getSql(updateAsXmlSqlS, updateAsJsonSqlS);
if (this.dataType == DataType.xml)
sql = updateAsXmlSqlS;
else if (this.dataType == DataType.json)
sql = updateAsJsonSqlS;
else
throw new IllegalStateException("Unhandled DataType " + this.dataType);
sql = MessageFormat.format(sql, getTableName());
try (PreparedStatement preparedStatement = this.connection.prepareStatement(sql)) { try (PreparedStatement preparedStatement = this.connection.prepareStatement(sql)) {

View File

@ -94,14 +94,7 @@ public class PostgreSqlOrderDao extends PostgresqlDao<Order> implements OrderDao
@Override @Override
protected void internalSave(final Order order) { protected void internalSave(final Order order) {
String sql; String sql = getSql(insertAsXmlSqlS, insertAsJsonSqlS);
if (this.dataType == DataType.xml)
sql = insertAsXmlSqlS;
else if (this.dataType == DataType.json)
sql = insertAsJsonSqlS;
else
throw new IllegalStateException("Unhandled DataType " + this.dataType);
sql = MessageFormat.format(sql, getTableName());
try (PreparedStatement preparedStatement = this.connection.prepareStatement(sql)) { try (PreparedStatement preparedStatement = this.connection.prepareStatement(sql)) {
@ -193,14 +186,7 @@ public class PostgreSqlOrderDao extends PostgresqlDao<Order> implements OrderDao
order.getVersion())); order.getVersion()));
} }
String sql; String sql = getSql(updateAsXmlSqlS, updateAsJsonSqlS);
if (this.dataType == DataType.xml)
sql = updateAsXmlSqlS;
else if (this.dataType == DataType.json)
sql = updateAsJsonSqlS;
else
throw new IllegalStateException("Unhandled DataType " + this.dataType);
sql = MessageFormat.format(sql, getTableName());
// now we update the existing object // now we update the existing object
try (PreparedStatement preparedStatement = this.connection.prepareStatement(sql)) { try (PreparedStatement preparedStatement = this.connection.prepareStatement(sql)) {

View File

@ -94,14 +94,7 @@ public class PostgreSqlResourceDao extends PostgresqlDao<Resource> implements Re
@Override @Override
protected void internalSave(final Resource resource) { protected void internalSave(final Resource resource) {
String sql; String sql = getSql(insertAsXmlSqlS, insertAsJsonSqlS);
if (this.dataType == DataType.xml)
sql = insertAsXmlSqlS;
else if (this.dataType == DataType.json)
sql = insertAsJsonSqlS;
else
throw new IllegalStateException("Unhandled DataType " + this.dataType);
sql = MessageFormat.format(sql, getTableName());
try (PreparedStatement preparedStatement = this.connection.prepareStatement(sql)) { try (PreparedStatement preparedStatement = this.connection.prepareStatement(sql)) {
@ -193,14 +186,7 @@ public class PostgreSqlResourceDao extends PostgresqlDao<Resource> implements Re
} }
// now we update the existing object // now we update the existing object
String sql; String sql = getSql(updateAsXmlSqlS, updateAsJsonSqlS);
if (this.dataType == DataType.xml)
sql = updateAsXmlSqlS;
else if (this.dataType == DataType.json)
sql = updateAsJsonSqlS;
else
throw new IllegalStateException("Unhandled DataType " + this.dataType);
sql = MessageFormat.format(sql, getTableName());
try (PreparedStatement preparedStatement = this.connection.prepareStatement(sql)) { try (PreparedStatement preparedStatement = this.connection.prepareStatement(sql)) {

View File

@ -33,29 +33,37 @@ import org.postgresql.util.PGobject;
import org.xml.sax.ContentHandler; import org.xml.sax.ContentHandler;
import org.xml.sax.SAXException; import org.xml.sax.SAXException;
@SuppressWarnings("nls")
public abstract class PostgresqlDao<T extends StrolchRootElement> implements StrolchDao<T> { public abstract class PostgresqlDao<T extends StrolchRootElement> implements StrolchDao<T> {
private static final String querySizeSqlS = "select count(*) from {0} where latest = true"; private static final String querySizeSqlS = "select count(*) from {0} where latest = true";
private static final String querySizeOfTypeSqlS = "select count(*) from {0} where type = ? and latest = true"; private static final String querySizeOfTypeSqlS = "select count(*) from {0} where type = ANY(?) and latest = true";
private static final String querySizeOfElementSqlS = "select count(*) from {0} where type = ? and id = ?"; private static final String querySizeOfElementSqlS = "select count(*) from {0} where type = ? and id = ?";
private static final String queryTypesSqlS = "select distinct type from {0} where latest = true"; private static final String queryTypesSqlS = "select distinct type from {0} where latest = true";
private static final String queryLatestVersionNumberForSqlS = "select count(*), max(version) from {0} where type = ? and id = ?"; private static final String queryLatestVersionNumberForSqlS = "select count(*), max(version) from {0} where type = ? and id = ?";
private static final String queryVersionsSizeForSqlS = "select count(*) from {0} where type = ? and id = ?"; private static final String queryVersionsSizeForSqlS = "select count(*) from {0} where type = ? and id = ?";
private static final String updateLatestSqlS = "update {0} set latest = true where type = ? and id = ? and version = ?";
private static final String deleteElementSqlS = "delete from {0} where id = ?"; private static final String deleteElementSqlS = "delete from {0} where id = ?";
private static final String deleteVersionSqlS = "delete from {0} where type = ? and id = ? and version = ? and latest = true"; private static final String deleteVersionSqlS = "delete from {0} where type = ? and id = ? and version = ? and latest = true";
private static final String updateLatestSqlS = "update {0} set latest = true where type = ? and id = ? and version = ?";
private static final String deleteAllSqlS = "delete from {0}"; private static final String deleteAllSqlS = "delete from {0}";
private static final String deleteAllByTypeSqlS = "delete from {0} where type = ?"; private static final String deleteAllByTypeSqlS = "delete from {0} where type = ?";
private static final String queryByVersionAsXmlSqlS = "select version, asxml from {0} where type = ? and id = ? and version = ?"; private static final String queryByVersionAsXmlSqlS = "select version, asxml from {0} where type = ? and id = ? and version = ?";
private static final String queryByVersionAsJsonSqlS = "select version, asjson from {0} where type = ? and id = ? and version = ?"; private static final String queryByVersionAsJsonSqlS = "select version, asjson from {0} where type = ? and id = ? and version = ?";
private static final String queryVersionsAsXmlForSqlS = "select asxml from {0} where type = ? and id = ? order by version"; private static final String queryVersionsAsXmlForSqlS = "select asxml from {0} where type = ? and id = ? order by version";
private static final String queryVersionsAsJsonForSqlS = "select asjson from {0} where type = ? and id = ? order by version"; private static final String queryVersionsAsJsonForSqlS = "select asjson from {0} where type = ? and id = ? order by version";
private static final String queryAllAsXmlSqlS = "select id, type, asxml from {0} where latest = true"; private static final String queryAllAsXmlSqlS = "select id, type, asxml from {0} where latest = true";
private static final String queryAllAsXmlLimitSqlS = "select id, type, asxml from {0} where latest = true order by id limit {1} offset {2}";
private static final String queryAllAsJsonSqlS = "select id, type, asjson from {0} where latest = true"; private static final String queryAllAsJsonSqlS = "select id, type, asjson from {0} where latest = true";
private static final String queryAllByTypeAsXmlSqlS = "select id, asxml from {0} where type = ? and latest = true"; private static final String queryAllAsJsonLimitSqlS = "select id, type, asjson from {0} where latest = true order by id limit {1} offset {2}";
private static final String queryAllByTypeAsJsonSqlS = "select id, asjson from {0} where type = ? and latest = true";
private static final String queryAllByTypeAsXmlSqlS = "select id, type, asxml from {0} where type = ANY(?) and latest = true";
private static final String queryAllByTypeAsXmlLimitSqlS = "select id, type, asxml from {0} where type = ANY(?) and latest = true order by id limit {1} offset {2}";
private static final String queryAllByTypeAsJsonSqlS = "select id, type, asjson from {0} where type = ANY(?) and latest = true";
private static final String queryAllByTypeAsJsonLimitSqlS = "select id, type, asjson from {0} where type = ANY(?) and latest = true order by id limit {1} offset {2}";
protected final DataType dataType; protected final DataType dataType;
protected Connection connection; protected Connection connection;
@ -72,6 +80,11 @@ public abstract class PostgresqlDao<T extends StrolchRootElement> implements Str
this.commands = new ArrayList<>(); this.commands = new ArrayList<>();
} }
@Override
public boolean supportsPaging() {
return true;
}
public DataType getDataType() { public DataType getDataType() {
return this.dataType; return this.dataType;
} }
@ -144,10 +157,16 @@ public abstract class PostgresqlDao<T extends StrolchRootElement> implements Str
} }
@Override @Override
public long querySize(String type) { public long querySize(String... types) {
if (types.length == 0)
return querySize();
String sql = MessageFormat.format(querySizeOfTypeSqlS, getTableName()); String sql = MessageFormat.format(querySizeOfTypeSqlS, getTableName());
try (PreparedStatement statement = this.connection.prepareStatement(sql)) { try (PreparedStatement statement = this.connection.prepareStatement(sql)) {
statement.setString(1, type);
Array typesArray = statement.getConnection().createArrayOf("varchar", types);
statement.setArray(1, typesArray);
try (ResultSet result = statement.executeQuery()) { try (ResultSet result = statement.executeQuery()) {
result.next(); result.next();
@ -161,9 +180,10 @@ public abstract class PostgresqlDao<T extends StrolchRootElement> implements Str
@Override @Override
public Set<String> queryTypes() { public Set<String> queryTypes() {
Set<String> keySet = new HashSet<>();
String sql = MessageFormat.format(queryTypesSqlS, getTableName()); String sql = MessageFormat.format(queryTypesSqlS, getTableName());
Set<String> keySet = new HashSet<>();
try (PreparedStatement statement = this.connection.prepareStatement(sql)) { try (PreparedStatement statement = this.connection.prepareStatement(sql)) {
try (ResultSet result = statement.executeQuery()) { try (ResultSet result = statement.executeQuery()) {
@ -182,14 +202,7 @@ public abstract class PostgresqlDao<T extends StrolchRootElement> implements Str
@Override @Override
public T queryBy(String type, String id, int versionNr) { public T queryBy(String type, String id, int versionNr) {
String sql; String sql = getSql(queryByVersionAsXmlSqlS, queryByVersionAsJsonSqlS);
if (this.dataType == DataType.xml)
sql = queryByVersionAsXmlSqlS;
else if (this.dataType == DataType.json)
sql = queryByVersionAsJsonSqlS;
else
throw new IllegalStateException("Unhandled DataType " + this.dataType);
sql = MessageFormat.format(sql, getTableName());
try (PreparedStatement statement = this.connection.prepareStatement(sql)) { try (PreparedStatement statement = this.connection.prepareStatement(sql)) {
statement.setString(1, type); statement.setString(1, type);
@ -220,17 +233,9 @@ public abstract class PostgresqlDao<T extends StrolchRootElement> implements Str
@Override @Override
public List<T> queryVersionsFor(String type, String id) { public List<T> queryVersionsFor(String type, String id) {
String sql = getSql(queryVersionsAsXmlForSqlS, queryVersionsAsJsonForSqlS);
List<T> list = new ArrayList<>(1); List<T> list = new ArrayList<>(1);
String sql;
if (this.dataType == DataType.xml)
sql = queryVersionsAsXmlForSqlS;
else if (this.dataType == DataType.json)
sql = queryVersionsAsJsonForSqlS;
else
throw new IllegalStateException("Unhandled DataType " + this.dataType);
sql = MessageFormat.format(sql, getTableName());
try (PreparedStatement statement = this.connection.prepareStatement(sql)) { try (PreparedStatement statement = this.connection.prepareStatement(sql)) {
statement.setString(1, type); statement.setString(1, type);
statement.setString(2, id); statement.setString(2, id);
@ -296,17 +301,16 @@ public abstract class PostgresqlDao<T extends StrolchRootElement> implements Str
@Override @Override
public List<T> queryAll() { public List<T> queryAll() {
return queryAll(Integer.MAX_VALUE, 0);
}
@Override
public List<T> queryAll(long limit, long offset) {
List<T> list = new ArrayList<>(); List<T> list = new ArrayList<>();
String sql; String sql = getLimitSql(limit, offset, queryAllAsXmlSqlS, queryAllAsJsonSqlS, queryAllAsXmlLimitSqlS,
if (this.dataType == DataType.xml) queryAllAsJsonLimitSqlS);
sql = queryAllAsXmlSqlS;
else if (this.dataType == DataType.json)
sql = queryAllAsJsonSqlS;
else
throw new IllegalStateException("Unhandled DataType " + this.dataType);
sql = MessageFormat.format(sql, getTableName());
try (PreparedStatement statement = this.connection.prepareStatement(sql)) { try (PreparedStatement statement = this.connection.prepareStatement(sql)) {
@ -326,25 +330,29 @@ public abstract class PostgresqlDao<T extends StrolchRootElement> implements Str
} }
@Override @Override
public List<T> queryAll(String type) { public List<T> queryAll(String... types) {
return queryAll(Integer.MAX_VALUE, 0, types);
}
@Override
public List<T> queryAll(long limit, long offset, String... types) {
if (types.length == 0)
return queryAll(limit, offset);
List<T> list = new ArrayList<>(); List<T> list = new ArrayList<>();
String sql; String sql = getLimitSql(limit, offset, queryAllByTypeAsXmlSqlS, queryAllByTypeAsJsonSqlS,
if (this.dataType == DataType.xml) queryAllByTypeAsXmlLimitSqlS, queryAllByTypeAsJsonLimitSqlS);
sql = queryAllByTypeAsXmlSqlS;
else if (this.dataType == DataType.json)
sql = queryAllByTypeAsJsonSqlS;
else
throw new IllegalStateException("Unhandled DataType " + this.dataType);
sql = MessageFormat.format(sql, getTableName());
try (PreparedStatement statement = this.connection.prepareStatement(sql)) { try (PreparedStatement statement = this.connection.prepareStatement(sql)) {
statement.setString(1, type);
Array typesArray = statement.getConnection().createArrayOf("varchar", types);
statement.setArray(1, typesArray);
try (ResultSet result = statement.executeQuery()) { try (ResultSet result = statement.executeQuery()) {
while (result.next()) { while (result.next()) {
String id = result.getString("id"); String id = result.getString("id");
String type = result.getString("type");
list.add(parseDbObject(result, id, type)); list.add(parseDbObject(result, id, type));
} }
@ -356,6 +364,37 @@ public abstract class PostgresqlDao<T extends StrolchRootElement> implements Str
} }
} }
protected String getLimitSql(long limit, long offset, String xmlSql, String jsonSql, String xmlLimitSql,
String jsonLimitSql) {
String sql;
if (limit == Integer.MAX_VALUE) {
return getSql(xmlSql, jsonSql);
}
if (this.dataType == DataType.xml)
sql = xmlLimitSql;
else if (this.dataType == DataType.json)
sql = jsonLimitSql;
else
throw new IllegalStateException("Unhandled DataType " + this.dataType);
return MessageFormat.format(sql, getTableName(), limit, offset);
}
protected String getSql(String xmlSql, String jsonSql) {
String sql;
if (this.dataType == DataType.xml)
sql = xmlSql;
else if (this.dataType == DataType.json)
sql = jsonSql;
else
throw new IllegalStateException("Unhandled DataType " + this.dataType);
return MessageFormat.format(sql, getTableName());
}
@Override @Override
public void save(T res) { public void save(T res) {
this.commands.add(txResult -> { this.commands.add(txResult -> {

View File

@ -37,6 +37,11 @@ public abstract class AbstractDao<T extends StrolchRootElement> implements Strol
this.tx = strolchTx.getTx(); this.tx = strolchTx.getTx();
} }
@Override
public boolean supportsPaging() {
return false;
}
protected abstract String getClassType(); protected abstract String getClassType();
protected IdOfSubTypeRef getIdRef(String type, String id) { protected IdOfSubTypeRef getIdRef(String type, String id) {
@ -52,7 +57,6 @@ public abstract class AbstractDao<T extends StrolchRootElement> implements Strol
long size = 0; long size = 0;
Set<String> types = queryTypes(); Set<String> types = queryTypes();
for (String type : types) { for (String type : types) {
SubTypeRef subTypeRef = getTypeRef(type); SubTypeRef subTypeRef = getTypeRef(type);
size += this.tx.getMetadataDao().querySize(subTypeRef); size += this.tx.getMetadataDao().querySize(subTypeRef);
} }
@ -60,9 +64,23 @@ public abstract class AbstractDao<T extends StrolchRootElement> implements Strol
} }
@Override @Override
public long querySize(String type) { public long querySize(String... types) {
SubTypeRef subTypeRef = getTypeRef(type);
return this.tx.getMetadataDao().querySize(subTypeRef); if (types.length == 0)
return querySize();
if (types.length == 1) {
SubTypeRef subTypeRef = getTypeRef(types[0]);
return this.tx.getMetadataDao().querySize(subTypeRef);
}
int size = 0;
for (String type : types) {
SubTypeRef subTypeRef = getTypeRef(type);
size += this.tx.getMetadataDao().querySize(subTypeRef);
}
return size;
} }
@Override @Override
@ -84,8 +102,20 @@ public abstract class AbstractDao<T extends StrolchRootElement> implements Strol
} }
@Override @Override
public List<T> queryAll(String type) { public List<T> queryAll(String... types) {
return this.tx.getObjectDao().queryAll(getTypeRef(type)); if (types.length == 0)
return queryAll();
if (types.length == 1) {
return this.tx.getObjectDao().queryAll(getTypeRef(types[0]));
}
List<T> objects = new ArrayList<>();
for (String type : types) {
objects.addAll(this.tx.getObjectDao().queryAll(getTypeRef(type)));
}
return objects;
} }
@Override @Override
@ -135,6 +165,16 @@ public abstract class AbstractDao<T extends StrolchRootElement> implements Strol
// nothing to do // nothing to do
} }
@Override
public List<T> queryAll(long limit, long offset) throws StrolchPersistenceException {
throw new UnsupportedOperationException("Paging not supported! Check first with supportsPaging()");
}
@Override
public List<T> queryAll(long limit, long offset, String... types) throws StrolchPersistenceException {
throw new UnsupportedOperationException("Paging not supported! Check first with supportsPaging()");
}
@Override @Override
public void removeVersion(T element) throws StrolchPersistenceException { public void removeVersion(T element) throws StrolchPersistenceException {
throw new UnsupportedOperationException("Versioning is not supported!"); throw new UnsupportedOperationException("Versioning is not supported!");