Skip to content
Snippets Groups Projects
Verified Commit aa2568f9 authored by Timm Fitschen's avatar Timm Fitschen
Browse files

WIP: count query

parent fb88660c
No related branches found
No related tags found
2 merge requests!44Release 0.6,!43Merge f-GRPC-main to dev
Pipeline #11507 passed
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>org.caosdb</groupId> <groupId>org.caosdb</groupId>
<artifactId>caosdb-server</artifactId> <artifactId>caosdb-server</artifactId>
<version>0.5.0-GRPC0.0.9</version> <version>0.5.0-GRPC0.0.10</version>
<packaging>jar</packaging> <packaging>jar</packaging>
<name>CaosDB Server</name> <name>CaosDB Server</name>
<scm> <scm>
......
...@@ -218,7 +218,8 @@ public class EntityTransactionServiceImpl extends EntityTransactionServiceImplBa ...@@ -218,7 +218,8 @@ public class EntityTransactionServiceImpl extends EntityTransactionServiceImplBa
for (final TransactionRequest sub_request : request.getRequestsList()) { for (final TransactionRequest sub_request : request.getRequestsList()) {
if (sub_request.getRetrieveRequest().hasQuery() if (sub_request.getRetrieveRequest().hasQuery()
&& !sub_request.getRetrieveRequest().getQuery().getQuery().isBlank()) { && !sub_request.getRetrieveRequest().getQuery().getQuery().isBlank()) {
container.getFlags().put("query", sub_request.getRetrieveRequest().getQuery().getQuery()); final String query = sub_request.getRetrieveRequest().getQuery().getQuery();
container.getFlags().put("query", query);
} else { } else {
final String id = sub_request.getRetrieveRequest().getId(); final String id = sub_request.getRetrieveRequest().getId();
if (!id.isBlank()) { if (!id.isBlank()) {
...@@ -234,11 +235,18 @@ public class EntityTransactionServiceImpl extends EntityTransactionServiceImplBa ...@@ -234,11 +235,18 @@ public class EntityTransactionServiceImpl extends EntityTransactionServiceImplBa
final Retrieve transaction = new Retrieve(container); final Retrieve transaction = new Retrieve(container);
transaction.execute(); transaction.execute();
if (container.getFlags().containsKey("_isCount")) {
final int count = Integer.parseInt(container.getFlags().get("_isCount"));
builder
.addResponsesBuilder()
.setRetrieveResponse(RetrieveResponse.newBuilder().setCountResult(count));
} else {
for (final EntityInterface entity : container) { for (final EntityInterface entity : container) {
builder builder
.addResponsesBuilder() .addResponsesBuilder()
.setRetrieveResponse(RetrieveResponse.newBuilder().setEntity(convert(entity))); .setRetrieveResponse(RetrieveResponse.newBuilder().setEntity(convert(entity)));
} }
}
// Add those entities which have not been retrieved because the have a string id // Add those entities which have not been retrieved because the have a string id
for (final TransactionRequest sub_request : request.getRequestsList()) { for (final TransactionRequest sub_request : request.getRequestsList()) {
......
...@@ -29,6 +29,7 @@ import org.caosdb.server.jobs.JobAnnotation; ...@@ -29,6 +29,7 @@ import org.caosdb.server.jobs.JobAnnotation;
import org.caosdb.server.jobs.TransactionStage; import org.caosdb.server.jobs.TransactionStage;
import org.caosdb.server.query.Query; import org.caosdb.server.query.Query;
import org.caosdb.server.query.Query.ParsingException; import org.caosdb.server.query.Query.ParsingException;
import org.caosdb.server.query.Query.Type;
import org.caosdb.server.utils.EntityStatus; import org.caosdb.server.utils.EntityStatus;
import org.caosdb.server.utils.ServerMessages; import org.caosdb.server.utils.ServerMessages;
...@@ -52,7 +53,10 @@ public class ExecuteQuery extends FlagJob { ...@@ -52,7 +53,10 @@ public class ExecuteQuery extends FlagJob {
getContainer().addMessage(new Message(e.getMessage())); getContainer().addMessage(new Message(e.getMessage()));
} }
getContainer().addMessage(queryInstance); getContainer().addMessage(queryInstance);
for (EntityInterface entity : getContainer()) { if (queryInstance.getQuery().getType() == Type.COUNT) {
getContainer().getFlags().put("count", Integer.toString(queryInstance.getCount()));
}
for (final EntityInterface entity : getContainer()) {
getTransaction().getSchedule().addAll(loadJobs(entity, getTransaction())); getTransaction().getSchedule().addAll(loadJobs(entity, getTransaction()));
} }
} }
......
...@@ -174,7 +174,7 @@ public class Query implements QueryInterface, ToElementable, TransactionInterfac ...@@ -174,7 +174,7 @@ public class Query implements QueryInterface, ToElementable, TransactionInterfac
} }
public static class IdVersionPair { public static class IdVersionPair {
public IdVersionPair(Integer id, String version) { public IdVersionPair(final Integer id, final String version) {
this.id = id; this.id = id;
this.version = version; this.version = version;
} }
...@@ -191,9 +191,9 @@ public class Query implements QueryInterface, ToElementable, TransactionInterfac ...@@ -191,9 +191,9 @@ public class Query implements QueryInterface, ToElementable, TransactionInterfac
} }
@Override @Override
public boolean equals(Object obj) { public boolean equals(final Object obj) {
if (obj instanceof IdVersionPair) { if (obj instanceof IdVersionPair) {
IdVersionPair that = (IdVersionPair) obj; final IdVersionPair that = (IdVersionPair) obj;
return this.id == that.id && this.version == that.version; return this.id == that.id && this.version == that.version;
} }
return false; return false;
...@@ -205,12 +205,12 @@ public class Query implements QueryInterface, ToElementable, TransactionInterfac ...@@ -205,12 +205,12 @@ public class Query implements QueryInterface, ToElementable, TransactionInterfac
} }
} }
private boolean filterEntitiesWithoutRetrievePermisions = private final boolean filterEntitiesWithoutRetrievePermisions =
!CaosDBServer.getServerProperty( !CaosDBServer.getServerProperty(
ServerProperties.KEY_QUERY_FILTER_ENTITIES_WITHOUT_RETRIEVE_PERMISSIONS) ServerProperties.KEY_QUERY_FILTER_ENTITIES_WITHOUT_RETRIEVE_PERMISSIONS)
.equalsIgnoreCase("FALSE"); .equalsIgnoreCase("FALSE");
private Logger logger = org.slf4j.LoggerFactory.getLogger(getClass()); private final Logger logger = org.slf4j.LoggerFactory.getLogger(getClass());
List<IdVersionPair> resultSet = null; List<IdVersionPair> resultSet = null;
private final String query; private final String query;
private Pattern entity = null; private Pattern entity = null;
...@@ -461,8 +461,8 @@ public class Query implements QueryInterface, ToElementable, TransactionInterfac ...@@ -461,8 +461,8 @@ public class Query implements QueryInterface, ToElementable, TransactionInterfac
} }
} }
private String initQuery(boolean versioned) throws QueryException { private String initQuery(final boolean versioned) throws QueryException {
String sql = "call initQuery(" + versioned + ")"; final String sql = "call initQuery(" + versioned + ")";
try (final CallableStatement callInitQuery = getConnection().prepareCall(sql)) { try (final CallableStatement callInitQuery = getConnection().prepareCall(sql)) {
ResultSet initQueryResult = null; ResultSet initQueryResult = null;
initQueryResult = callInitQuery.executeQuery(); initQueryResult = callInitQuery.executeQuery();
...@@ -481,7 +481,7 @@ public class Query implements QueryInterface, ToElementable, TransactionInterfac ...@@ -481,7 +481,7 @@ public class Query implements QueryInterface, ToElementable, TransactionInterfac
* @param optimize whether to run optimize() immediately. * @param optimize whether to run optimize() immediately.
* @throws ParsingException * @throws ParsingException
*/ */
public void parse(boolean optimize) throws ParsingException { public void parse(final boolean optimize) throws ParsingException {
final long t1 = System.currentTimeMillis(); final long t1 = System.currentTimeMillis();
CQLLexer lexer; CQLLexer lexer;
lexer = new CQLLexer(CharStreams.fromString(this.query)); lexer = new CQLLexer(CharStreams.fromString(this.query));
...@@ -544,7 +544,7 @@ public class Query implements QueryInterface, ToElementable, TransactionInterfac ...@@ -544,7 +544,7 @@ public class Query implements QueryInterface, ToElementable, TransactionInterfac
} }
} }
private String executeStrategy(boolean versioned) throws QueryException { private String executeStrategy(final boolean versioned) throws QueryException {
if (this.entity != null) { if (this.entity != null) {
return sourceStrategy(initQuery(versioned)); return sourceStrategy(initQuery(versioned));
} else if (this.role == Role.ENTITY && this.filter == null) { } else if (this.role == Role.ENTITY && this.filter == null) {
...@@ -567,7 +567,7 @@ public class Query implements QueryInterface, ToElementable, TransactionInterfac ...@@ -567,7 +567,7 @@ public class Query implements QueryInterface, ToElementable, TransactionInterfac
* @throws QueryException * @throws QueryException
*/ */
private String generateSelectStatementForResultSet( private String generateSelectStatementForResultSet(
final String resultSetTableName, boolean versioned) { final String resultSetTableName, final boolean versioned) {
if (resultSetTableName.equals("entities")) { if (resultSetTableName.equals("entities")) {
return "SELECT entity_id AS id" return "SELECT entity_id AS id"
+ (versioned ? ", version AS version" : "") + (versioned ? ", version AS version" : "")
...@@ -592,7 +592,7 @@ public class Query implements QueryInterface, ToElementable, TransactionInterfac ...@@ -592,7 +592,7 @@ public class Query implements QueryInterface, ToElementable, TransactionInterfac
* @return list of results of this query. * @return list of results of this query.
* @throws QueryException * @throws QueryException
*/ */
private List<IdVersionPair> getResultSet(final String resultSetTableName, boolean versioned) private List<IdVersionPair> getResultSet(final String resultSetTableName, final boolean versioned)
throws QueryException { throws QueryException {
ResultSet finishResultSet = null; ResultSet finishResultSet = null;
try { try {
...@@ -688,7 +688,7 @@ public class Query implements QueryInterface, ToElementable, TransactionInterfac ...@@ -688,7 +688,7 @@ public class Query implements QueryInterface, ToElementable, TransactionInterfac
* @param key * @param key
* @param resultSet * @param resultSet
*/ */
private void setCache(String key, List<IdVersionPair> resultSet) { private void setCache(final String key, final List<IdVersionPair> resultSet) {
synchronized (cache) { synchronized (cache) {
if (resultSet instanceof Serializable) { if (resultSet instanceof Serializable) {
cache.put(key, (Serializable) resultSet); cache.put(key, (Serializable) resultSet);
...@@ -705,11 +705,11 @@ public class Query implements QueryInterface, ToElementable, TransactionInterfac ...@@ -705,11 +705,11 @@ public class Query implements QueryInterface, ToElementable, TransactionInterfac
* @return * @return
*/ */
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
private List<IdVersionPair> getCached(String key) { private List<IdVersionPair> getCached(final String key) {
return (List<IdVersionPair>) cache.get(key); return (List<IdVersionPair>) cache.get(key);
} }
protected void executeNoCache(Access access) { protected void executeNoCache(final Access access) {
try { try {
this.resultSet = getResultSet(executeStrategy(this.versioned), this.versioned); this.resultSet = getResultSet(executeStrategy(this.versioned), this.versioned);
} finally { } finally {
...@@ -799,7 +799,7 @@ public class Query implements QueryInterface, ToElementable, TransactionInterfac ...@@ -799,7 +799,7 @@ public class Query implements QueryInterface, ToElementable, TransactionInterfac
return entities; return entities;
} }
List<IdVersionPair> result = new ArrayList<>(); final List<IdVersionPair> result = new ArrayList<>();
final Iterator<IdVersionPair> iterator = entities.iterator(); final Iterator<IdVersionPair> iterator = entities.iterator();
while (iterator.hasNext()) { while (iterator.hasNext()) {
final long t1 = System.currentTimeMillis(); final long t1 = System.currentTimeMillis();
...@@ -866,11 +866,7 @@ public class Query implements QueryInterface, ToElementable, TransactionInterfac ...@@ -866,11 +866,7 @@ public class Query implements QueryInterface, ToElementable, TransactionInterfac
return; return;
} }
ret.setAttribute("string", this.query); ret.setAttribute("string", this.query);
if (this.resultSet != null) { ret.setAttribute("results", Integer.toString(getCount()));
ret.setAttribute("results", Integer.toString(this.resultSet.size()));
} else {
ret.setAttribute("results", "0");
}
ret.setAttribute("cached", Boolean.toString(this.cached)); ret.setAttribute("cached", Boolean.toString(this.cached));
ret.setAttribute("etag", cacheETag); ret.setAttribute("etag", cacheETag);
...@@ -971,11 +967,19 @@ public class Query implements QueryInterface, ToElementable, TransactionInterfac ...@@ -971,11 +967,19 @@ public class Query implements QueryInterface, ToElementable, TransactionInterfac
* @return A Cache key. * @return A Cache key.
*/ */
String getCacheKey() { String getCacheKey() {
StringBuilder sb = new StringBuilder(); final StringBuilder sb = new StringBuilder();
if (this.versioned) sb.append("versioned"); if (this.versioned) {
if (this.role != null) sb.append(this.role.toString()); sb.append("versioned");
if (this.entity != null) sb.append(this.entity.toString()); }
if (this.filter != null) sb.append(this.filter.getCacheKey()); if (this.role != null) {
sb.append(this.role.toString());
}
if (this.entity != null) {
sb.append(this.entity.toString());
}
if (this.filter != null) {
sb.append(this.filter.getCacheKey());
}
return sb.toString(); return sb.toString();
} }
...@@ -998,4 +1002,12 @@ public class Query implements QueryInterface, ToElementable, TransactionInterfac ...@@ -998,4 +1002,12 @@ public class Query implements QueryInterface, ToElementable, TransactionInterfac
public static String getETag() { public static String getETag() {
return cacheETag; return cacheETag;
} }
public int getCount() {
if (this.resultSet != null) {
return this.resultSet.size();
} else {
return -1;
}
}
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment