diff --git a/src/main/java/com/netgrif/application/engine/pfql/domain/antlr4/QueryLang.g4 b/src/main/java/com/netgrif/application/engine/pfql/domain/antlr4/QueryLang.g4 index d98dc27bc8..b561bf21b6 100644 --- a/src/main/java/com/netgrif/application/engine/pfql/domain/antlr4/QueryLang.g4 +++ b/src/main/java/com/netgrif/application/engine/pfql/domain/antlr4/QueryLang.g4 @@ -245,7 +245,7 @@ placesComparison: places SPACE numberComparison # placesBasic | places SPACE inRangeNumberComparison # placesRange | places SPACE nullComparison # placesNull ; -tasksStateComparison: tasksState SPACE (NOT SPACE?)? op=EQ SPACE state=(ENABLED | DISABLED) ; +tasksStateComparison: tasksState SPACE (NOT SPACE?)? op=(EQ | NEQ) SPACE state=(ENABLED | DISABLED) ; tasksUserIdComparison: tasksUserId SPACE stringComparison # tasksUserIdBasic | tasksUserId SPACE inListStringComparison # tasksUserIdList | tasksUserId SPACE nullComparison # tasksUserIdNull diff --git a/src/main/java/com/netgrif/application/engine/pfql/service/QueryLangEvaluator.java b/src/main/java/com/netgrif/application/engine/pfql/service/QueryLangEvaluator.java index 7230c30854..b91a87ac99 100644 --- a/src/main/java/com/netgrif/application/engine/pfql/service/QueryLangEvaluator.java +++ b/src/main/java/com/netgrif/application/engine/pfql/service/QueryLangEvaluator.java @@ -1489,16 +1489,16 @@ public void exitPlacesRange(QueryLangParser.PlacesRangeContext ctx) { @Override public void exitTasksStateComparison(QueryLangParser.TasksStateComparisonContext ctx) { - // todo implement task states -// String taskId = ctx.tasksState().taskId.getText(); -// Token op = ctx.op; -// checkOp(ComparisonType.STRING, op); -// boolean not = ctx.NOT() != null; -// State state = ctx.state.getType() == QueryLangParser.ENABLED ? State.ENABLED : State.DISABLED; -// -// setMongoQuery(ctx, null); -// setElasticQuery(ctx, buildElasticQuery("tasks." + taskId + ".state", op.getType(), state.toString(), not)); -// this.searchWithElastic = true; + String transId = ctx.tasksState().taskId.getText(); + Token op = ctx.op; + checkOp(ComparisonType.STRING, op); + boolean not = ctx.NOT() != null; + boolean isEnabled = ctx.state.getType() == QueryLangParser.ENABLED; + boolean taskIsExecutable = isEnabled != not; + + setMongoQuery(ctx, null); + setElasticQuery(ctx, buildElasticQuery("taskIds", op.getType(), transId, !taskIsExecutable)); + this.searchWithElastic = true; } @Override diff --git a/src/test/java/com/netgrif/application/engine/pfql/QueryLangTest.java b/src/test/java/com/netgrif/application/engine/pfql/QueryLangTest.java index a9eaf34052..af22111c2d 100644 --- a/src/test/java/com/netgrif/application/engine/pfql/QueryLangTest.java +++ b/src/test/java/com/netgrif/application/engine/pfql/QueryLangTest.java @@ -149,6 +149,18 @@ public void testSearchService() throws InterruptedException { cases = searchService.search("cases: processIdentifier eq 'query_test' and data.text_0.value eq 'x44'*"); assertEquals(1, ((Page) cases).getTotalElements()); + + cases = searchService.search("cases: processIdentifier eq 'query_test' and tasks.t1.state eq enabled"); + assertEquals(10, ((Page) cases).getTotalElements()); + + cases = searchService.search("cases: processIdentifier eq 'query_test' and tasks.t1.state eq disabled"); + assertEquals(0, ((Page) cases).getTotalElements()); + + cases = searchService.search("cases: processIdentifier eq 'query_test' and tasks.t1.state neq disabled"); + assertEquals(10, ((Page) cases).getTotalElements()); + + cases = searchService.search("cases: processIdentifier eq 'query_test' and tasks.t1.state not eq disabled"); + assertEquals(10, ((Page) cases).getTotalElements()); } @Test @@ -1146,13 +1158,12 @@ public void testSimpleElasticCaseQuery() { checkNumberComparisonElastic("case", "places.p1.marking", "places.p1.marking"); // task state comparison -// TODO: fix -// actual = evaluateQuery("case: tasks.t1.state eq enabled").getFullElasticQuery(); -// expected = String.format("tasks.t1.state:%s", State.ENABLED); -// assertEquals(expected, actual); -// actual = evaluateQuery("case: tasks.t1.state eq disabled").getFullElasticQuery(); -// expected = String.format("tasks.t1.state:%s", State.DISABLED); -// assertEquals(expected, actual); + actual = evaluateQuery("case: tasks.t1.state eq enabled").getFullElasticQuery(); + expected = "taskIds:t1"; + assertEquals(expected, actual); + actual = evaluateQuery("case: tasks.t1.state eq disabled").getFullElasticQuery(); + expected = "NOT taskIds:t1"; + assertEquals(expected, actual); // task userId comparison actual = evaluateQuery("case: tasks.t1.userId eq 'test'").getFullElasticQuery();