From 5fd0c53883a879325d884727de59a78855424a95 Mon Sep 17 00:00:00 2001 From: Loay Ghreeb Date: Fri, 10 Jan 2025 15:05:26 +0200 Subject: [PATCH 1/2] Searching for entries with empty field --- .../search/query/SearchToSqlVisitor.java | 8 +++++ .../query/SearchQuerySQLConversionTest.java | 32 +++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/src/main/java/org/jabref/logic/search/query/SearchToSqlVisitor.java b/src/main/java/org/jabref/logic/search/query/SearchToSqlVisitor.java index e204ea9de78..3ad64e299de 100644 --- a/src/main/java/org/jabref/logic/search/query/SearchToSqlVisitor.java +++ b/src/main/java/org/jabref/logic/search/query/SearchToSqlVisitor.java @@ -207,6 +207,14 @@ public SqlQueryNode visitComparison(SearchParser.ComparisonContext ctx) { setFlags(searchFlags, REGULAR_EXPRESSION, true, true); } + // field = "" -> should find entries where the field is empty + // field != "" -> should find entries where the field is not empty + if (term.isEmpty() && searchFlags.contains(NEGATION)) { + searchFlags.remove(NEGATION); + } else if (term.isEmpty()) { + searchFlags.add(NEGATION); + } + return getFieldQueryNode(field.toLowerCase(Locale.ROOT), term, searchFlags); } diff --git a/src/test/java/org/jabref/logic/search/query/SearchQuerySQLConversionTest.java b/src/test/java/org/jabref/logic/search/query/SearchQuerySQLConversionTest.java index 87172feff1d..755171768ec 100644 --- a/src/test/java/org/jabref/logic/search/query/SearchQuerySQLConversionTest.java +++ b/src/test/java/org/jabref/logic/search/query/SearchQuerySQLConversionTest.java @@ -695,6 +695,38 @@ cte0 AS ( ) ) SELECT * FROM cte0 GROUP BY entryid""" + ), + + Arguments.of( + "file = \"\"", + """ + WITH + cte0 AS ( + SELECT main_table.entryid + FROM bib_fields."tableName" AS main_table + WHERE main_table.entryid NOT IN ( + SELECT inner_table.entryid + FROM bib_fields."tableName" AS inner_table + WHERE ( + (inner_table.field_name = 'file') AND ((inner_table.field_value_literal ILIKE ('%%')) OR (inner_table.field_value_transformed ILIKE ('%%'))) + ) + ) + ) + SELECT * FROM cte0 GROUP BY entryid""" + ), + + Arguments.of( + "file != \"\"", + """ + WITH + cte0 AS ( + SELECT main_table.entryid + FROM bib_fields."tableName" AS main_table + WHERE ( + (main_table.field_name = 'file') AND ((main_table.field_value_literal ILIKE ('%%')) OR (main_table.field_value_transformed ILIKE ('%%'))) + ) + ) + SELECT * FROM cte0 GROUP BY entryid""" ) ); } From f7bc3f8a90c6638184869135faf5df3f41bc19ce Mon Sep 17 00:00:00 2001 From: Loay Ghreeb Date: Fri, 10 Jan 2025 15:12:10 +0200 Subject: [PATCH 2/2] Simplify condition --- .../jabref/logic/search/query/SearchToSqlVisitor.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/jabref/logic/search/query/SearchToSqlVisitor.java b/src/main/java/org/jabref/logic/search/query/SearchToSqlVisitor.java index 3ad64e299de..8805c9b19cc 100644 --- a/src/main/java/org/jabref/logic/search/query/SearchToSqlVisitor.java +++ b/src/main/java/org/jabref/logic/search/query/SearchToSqlVisitor.java @@ -209,10 +209,12 @@ public SqlQueryNode visitComparison(SearchParser.ComparisonContext ctx) { // field = "" -> should find entries where the field is empty // field != "" -> should find entries where the field is not empty - if (term.isEmpty() && searchFlags.contains(NEGATION)) { - searchFlags.remove(NEGATION); - } else if (term.isEmpty()) { - searchFlags.add(NEGATION); + if (term.isEmpty()) { + if (searchFlags.contains(NEGATION)) { + searchFlags.remove(NEGATION); + } else { + searchFlags.add(NEGATION); + } } return getFieldQueryNode(field.toLowerCase(Locale.ROOT), term, searchFlags);