From d6725ca7d81547b5c038e0ede00125a16defb382 Mon Sep 17 00:00:00 2001 From: mswertz Date: Tue, 11 Jun 2024 09:08:42 +0200 Subject: [PATCH 1/4] fix: search should work as (term1 and term2) --- .../molgenis/emx2/graphql/GraphqlTableFieldFactory.java | 7 ++++++- .../src/main/java/org/molgenis/emx2/sql/SqlQuery.java | 6 ++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/backend/molgenis-emx2-graphql/src/main/java/org/molgenis/emx2/graphql/GraphqlTableFieldFactory.java b/backend/molgenis-emx2-graphql/src/main/java/org/molgenis/emx2/graphql/GraphqlTableFieldFactory.java index 196379a187..aa26f59194 100644 --- a/backend/molgenis-emx2-graphql/src/main/java/org/molgenis/emx2/graphql/GraphqlTableFieldFactory.java +++ b/backend/molgenis-emx2-graphql/src/main/java/org/molgenis/emx2/graphql/GraphqlTableFieldFactory.java @@ -531,7 +531,12 @@ public static FilterBean[] convertMapToFilterArray( subFilters.add(and(nestedFilters.toArray(new Filter[nestedFilters.size()]))); } } else if (entry.getKey().equals(FILTER_SEARCH)) { - subFilters.add(f(Operator.TRIGRAM_SEARCH, entry.getValue())); + if (entry.getValue() instanceof String && entry.getValue().toString().trim() != "") { + subFilters.add( + f( + Operator.TRIGRAM_SEARCH, + Arrays.stream(entry.getValue().toString().split(" ")).toArray(String[]::new))); + } } else if (entry.getKey().equals(FILTER_EQUALS)) { // complex filter, should be an list of maps per graphql contract if (entry.getValue() != null) { diff --git a/backend/molgenis-emx2-sql/src/main/java/org/molgenis/emx2/sql/SqlQuery.java b/backend/molgenis-emx2-sql/src/main/java/org/molgenis/emx2/sql/SqlQuery.java index e55f58b68c..96615deaf3 100644 --- a/backend/molgenis-emx2-sql/src/main/java/org/molgenis/emx2/sql/SqlQuery.java +++ b/backend/molgenis-emx2-sql/src/main/java/org/molgenis/emx2/sql/SqlQuery.java @@ -519,8 +519,9 @@ private List jsonFilterQueryConditions( private Condition jsonSearchConditions( SqlTableMetadata table, String subAlias, String[] searchTerms) { // create search - List search = new ArrayList<>(); + List searchCondition = new ArrayList<>(); for (String term : searchTerms) { + List search = new ArrayList<>(); search.add( field(name(alias(subAlias), searchColumnName(table.getTableName()))) .likeIgnoreCase("%" + term + "%")); @@ -570,8 +571,9 @@ private Condition jsonSearchConditions( .likeIgnoreCase("%" + term + "%")); parent = parent.getInheritedTable(); } + searchCondition.add(or(search)); } - return or(search); + return and(searchCondition); } private Collection> jsonSubselectFields( From edf16b7a4ab38f06956fa1b581d3f615a2a6fcfc Mon Sep 17 00:00:00 2001 From: mswertz Date: Tue, 11 Jun 2024 09:47:43 +0200 Subject: [PATCH 2/4] add test --- .../emx2/graphql/GraphqlTableFieldFactory.java | 4 +++- .../main/java/org/molgenis/emx2/sql/SqlQuery.java | 2 +- .../org/molgenis/emx2/sql/TestFullTextSearch.java | 15 +++++++++++++++ 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/backend/molgenis-emx2-graphql/src/main/java/org/molgenis/emx2/graphql/GraphqlTableFieldFactory.java b/backend/molgenis-emx2-graphql/src/main/java/org/molgenis/emx2/graphql/GraphqlTableFieldFactory.java index aa26f59194..320c1e3c0d 100644 --- a/backend/molgenis-emx2-graphql/src/main/java/org/molgenis/emx2/graphql/GraphqlTableFieldFactory.java +++ b/backend/molgenis-emx2-graphql/src/main/java/org/molgenis/emx2/graphql/GraphqlTableFieldFactory.java @@ -534,7 +534,9 @@ public static FilterBean[] convertMapToFilterArray( if (entry.getValue() instanceof String && entry.getValue().toString().trim() != "") { subFilters.add( f( - Operator.TRIGRAM_SEARCH, + Operator + .TEXT_SEARCH, // might change to trigram search if we learn how to tune for + // short terms Arrays.stream(entry.getValue().toString().split(" ")).toArray(String[]::new))); } } else if (entry.getKey().equals(FILTER_EQUALS)) { diff --git a/backend/molgenis-emx2-sql/src/main/java/org/molgenis/emx2/sql/SqlQuery.java b/backend/molgenis-emx2-sql/src/main/java/org/molgenis/emx2/sql/SqlQuery.java index 96615deaf3..ab40f13e46 100644 --- a/backend/molgenis-emx2-sql/src/main/java/org/molgenis/emx2/sql/SqlQuery.java +++ b/backend/molgenis-emx2-sql/src/main/java/org/molgenis/emx2/sql/SqlQuery.java @@ -1384,7 +1384,7 @@ private Condition whereConditionSearch( searchConditions.add(and(subConditions)); } } - return searchConditions.isEmpty() ? null : or(searchConditions); + return searchConditions.isEmpty() ? null : and(searchConditions); } private static SelectJoinStep limitOffsetOrderBy( diff --git a/backend/molgenis-emx2-sql/src/test/java/org/molgenis/emx2/sql/TestFullTextSearch.java b/backend/molgenis-emx2-sql/src/test/java/org/molgenis/emx2/sql/TestFullTextSearch.java index f4b76cd080..c060a016cb 100644 --- a/backend/molgenis-emx2-sql/src/test/java/org/molgenis/emx2/sql/TestFullTextSearch.java +++ b/backend/molgenis-emx2-sql/src/test/java/org/molgenis/emx2/sql/TestFullTextSearch.java @@ -106,6 +106,21 @@ public void nestedSearch() { // would exclude approved order assertTrue(!json.contains("approved")); + // test term1 AND term2 + json = schema.query("Pet").where(f(Operator.TEXT_SEARCH, "red", "green")).retrieveJSON(); + // would be spike and fire ant + assertTrue(json.contains("spike")); + assertTrue(json.contains("fire ant")); + assertTrue(!json.contains("tweety")); + + json = + schema + .query("Order") + .where(f("pet", f(Operator.TEXT_SEARCH, "red", "green"))) + .retrieveJSON(); + // would be only spike + assertTrue(json.contains("spike")); + // nesting example 2 json = schema From 8c5e9eaa23ab5df8a950e4250d48ca0ca14122a2 Mon Sep 17 00:00:00 2001 From: mswertz Date: Tue, 11 Jun 2024 09:51:21 +0200 Subject: [PATCH 3/4] sonar fix --- .../org/molgenis/emx2/graphql/GraphqlTableFieldFactory.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/molgenis-emx2-graphql/src/main/java/org/molgenis/emx2/graphql/GraphqlTableFieldFactory.java b/backend/molgenis-emx2-graphql/src/main/java/org/molgenis/emx2/graphql/GraphqlTableFieldFactory.java index 320c1e3c0d..74d646c0bd 100644 --- a/backend/molgenis-emx2-graphql/src/main/java/org/molgenis/emx2/graphql/GraphqlTableFieldFactory.java +++ b/backend/molgenis-emx2-graphql/src/main/java/org/molgenis/emx2/graphql/GraphqlTableFieldFactory.java @@ -531,7 +531,7 @@ public static FilterBean[] convertMapToFilterArray( subFilters.add(and(nestedFilters.toArray(new Filter[nestedFilters.size()]))); } } else if (entry.getKey().equals(FILTER_SEARCH)) { - if (entry.getValue() instanceof String && entry.getValue().toString().trim() != "") { + if (entry.getValue() instanceof String && !entry.getValue().toString().trim().equals("")) { subFilters.add( f( Operator From 1ae3de595948d6176dba16464d9bf785319ea33d Mon Sep 17 00:00:00 2001 From: mswertz Date: Tue, 11 Jun 2024 14:17:15 +0200 Subject: [PATCH 4/4] fixed trigram search to use textsearch and vice versa --- .../src/main/java/org/molgenis/emx2/sql/SqlQuery.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/molgenis-emx2-sql/src/main/java/org/molgenis/emx2/sql/SqlQuery.java b/backend/molgenis-emx2-sql/src/main/java/org/molgenis/emx2/sql/SqlQuery.java index ab40f13e46..c69ecbeb59 100644 --- a/backend/molgenis-emx2-sql/src/main/java/org/molgenis/emx2/sql/SqlQuery.java +++ b/backend/molgenis-emx2-sql/src/main/java/org/molgenis/emx2/sql/SqlQuery.java @@ -424,7 +424,7 @@ private List jsonFilterQueryConditions( } else if (Operator.AND.equals(f.getOperator())) { conditions.add( and(jsonFilterQueryConditions(table, column, tableAlias, subAlias, f, searchTerms))); - } else if (TRIGRAM_SEARCH.equals(f.getOperator())) { + } else if (TRIGRAM_SEARCH.equals(f.getOperator()) || TEXT_SEARCH.equals(f.getOperator())) { conditions.add( jsonSearchConditions(table, subAlias, TypeUtils.toStringArray(f.getValues()))); } else {