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..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,14 @@ 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().equals("")) { + subFilters.add( + f( + 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)) { // 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..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 { @@ -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( @@ -1382,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