diff --git a/src/main/java/org/jabref/gui/entryeditor/SourceTab.java b/src/main/java/org/jabref/gui/entryeditor/SourceTab.java index 629a991e0e8..a71cdd3b86f 100644 --- a/src/main/java/org/jabref/gui/entryeditor/SourceTab.java +++ b/src/main/java/org/jabref/gui/entryeditor/SourceTab.java @@ -105,13 +105,16 @@ public SourceTab(BibDatabaseContext bibDatabaseContext, } private void highlightSearchPattern() { - if (codeArea == null || searchQueryProperty.get().isEmpty()) { + if (codeArea == null) { return; } codeArea.setStyleClass(0, codeArea.getLength(), TEXT_STYLE); - Map, List> searchTermsMap = Highlighter.groupTermsByField(searchQueryProperty.get().get()); + if (searchQueryProperty.get().isEmpty()) { + return; + } + Map, List> searchTermsMap = Highlighter.groupTermsByField(searchQueryProperty.get().get()); searchTermsMap.forEach((optionalField, terms) -> { Optional searchPattern = Highlighter.buildSearchPattern(terms); if (searchPattern.isEmpty()) { diff --git a/src/main/java/org/jabref/gui/entryeditor/fileannotationtab/FulltextSearchResultsTab.java b/src/main/java/org/jabref/gui/entryeditor/fileannotationtab/FulltextSearchResultsTab.java index 5e98f7d737d..c727655356a 100644 --- a/src/main/java/org/jabref/gui/entryeditor/fileannotationtab/FulltextSearchResultsTab.java +++ b/src/main/java/org/jabref/gui/entryeditor/fileannotationtab/FulltextSearchResultsTab.java @@ -90,9 +90,6 @@ protected void bindToEntry(BibEntry entry) { if (entry == null || !shouldShow(entry)) { return; } - if (documentViewerView == null) { - documentViewerView = new DocumentViewerView(); - } this.entry = entry; content.getChildren().clear(); @@ -159,6 +156,9 @@ private Text createPageLink(LinkedFile linkedFile, int pageNumber) { pageLink.setOnMouseClicked(event -> { if (MouseButton.PRIMARY == event.getButton()) { + if (documentViewerView == null) { + documentViewerView = new DocumentViewerView(); + } documentViewerView.switchToFile(linkedFile); documentViewerView.gotoPage(pageNumber); documentViewerView.disableLiveMode(); diff --git a/src/main/java/org/jabref/logic/search/PostgreServer.java b/src/main/java/org/jabref/logic/search/PostgreServer.java index 13a113c441a..012f92f011d 100644 --- a/src/main/java/org/jabref/logic/search/PostgreServer.java +++ b/src/main/java/org/jabref/logic/search/PostgreServer.java @@ -23,6 +23,7 @@ public PostgreServer() { EmbeddedPostgres embeddedPostgres; try { embeddedPostgres = EmbeddedPostgres.builder() + .setOutputRedirector(ProcessBuilder.Redirect.DISCARD) .start(); LOGGER.info("Postgres server started, connection port: {}", embeddedPostgres.getPort()); } catch (IOException e) { diff --git a/src/main/java/org/jabref/logic/search/indexing/BibFieldsIndexer.java b/src/main/java/org/jabref/logic/search/indexing/BibFieldsIndexer.java index 6312ba54ffb..6ace9d64537 100644 --- a/src/main/java/org/jabref/logic/search/indexing/BibFieldsIndexer.java +++ b/src/main/java/org/jabref/logic/search/indexing/BibFieldsIndexer.java @@ -23,6 +23,7 @@ import org.jabref.model.entry.field.StandardField; import org.jabref.model.search.PostgreConstants; +import io.github.thibaultmeyer.cuid.CUID; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -53,7 +54,7 @@ public BibFieldsIndexer(BibEntryPreferences bibEntryPreferences, BibDatabaseCont this.keywordSeparator = bibEntryPreferences.getKeywordSeparator(); this.libraryName = databaseContext.getDatabasePath().map(path -> path.getFileName().toString()).orElse("unsaved"); - this.mainTable = databaseContext.getUniqueName(); + this.mainTable = CUID.randomCUID2(12).toString(); this.splitValuesTable = mainTable + SPLIT_TABLE_SUFFIX; this.schemaMainTableReference = PostgreConstants.getMainTableSchemaReference(mainTable); diff --git a/src/main/java/org/jabref/logic/search/query/SearchQueryConversion.java b/src/main/java/org/jabref/logic/search/query/SearchQueryConversion.java index 9c2b8ea0ff2..e782f31d1dc 100644 --- a/src/main/java/org/jabref/logic/search/query/SearchQueryConversion.java +++ b/src/main/java/org/jabref/logic/search/query/SearchQueryConversion.java @@ -7,7 +7,6 @@ import org.jabref.model.search.query.SqlQueryNode; import org.jabref.search.SearchParser; -import org.apache.lucene.search.Query; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -24,9 +23,9 @@ public static String flagsToSearchExpression(SearchQuery searchQuery) { return new SearchFlagsToExpressionVisitor(searchQuery.getSearchFlags()).visit(searchQuery.getContext()); } - public static Query searchToLucene(SearchQuery searchQuery) { + public static String searchToLucene(SearchQuery searchQuery) { LOGGER.debug("Converting search expression to Lucene: {}", searchQuery.getSearchExpression()); - return new SearchToLuceneVisitor().visit(searchQuery.getContext()); + return new SearchToLuceneVisitor(searchQuery.getSearchFlags()).visit(searchQuery.getContext()); } public static List extractSearchTerms(SearchQuery searchQuery) { diff --git a/src/main/java/org/jabref/logic/search/query/SearchToLuceneVisitor.java b/src/main/java/org/jabref/logic/search/query/SearchToLuceneVisitor.java index 4f38a0ed1e2..c25a162045c 100644 --- a/src/main/java/org/jabref/logic/search/query/SearchToLuceneVisitor.java +++ b/src/main/java/org/jabref/logic/search/query/SearchToLuceneVisitor.java @@ -1,152 +1,131 @@ package org.jabref.logic.search.query; +import java.util.EnumSet; import java.util.List; +import java.util.Locale; import org.jabref.model.search.LinkedFilesConstants; +import org.jabref.model.search.SearchFlags; import org.jabref.search.SearchBaseVisitor; import org.jabref.search.SearchParser; -import org.apache.lucene.index.Term; -import org.apache.lucene.search.BooleanClause; -import org.apache.lucene.search.BooleanQuery; -import org.apache.lucene.search.MatchNoDocsQuery; -import org.apache.lucene.search.Query; -import org.apache.lucene.search.RegexpQuery; -import org.apache.lucene.search.TermQuery; -import org.apache.lucene.util.QueryBuilder; +import org.apache.lucene.queryparser.classic.QueryParser; /** * Tests are located in {@link org.jabref.logic.search.query.SearchQueryLuceneConversionTest}. */ -public class SearchToLuceneVisitor extends SearchBaseVisitor { +public class SearchToLuceneVisitor extends SearchBaseVisitor { + private final EnumSet searchFlags; - private static final List SEARCH_FIELDS = LinkedFilesConstants.PDF_FIELDS; - - private final QueryBuilder queryBuilder; - - public SearchToLuceneVisitor() { - this.queryBuilder = new QueryBuilder(LinkedFilesConstants.LINKED_FILES_ANALYZER); + public SearchToLuceneVisitor(EnumSet searchFlags) { + this.searchFlags = searchFlags; } @Override - public Query visitStart(SearchParser.StartContext ctx) { + public String visitStart(SearchParser.StartContext ctx) { return visit(ctx.andExpression()); } @Override - public Query visitImplicitAndExpression(SearchParser.ImplicitAndExpressionContext ctx) { - List children = ctx.expression().stream().map(this::visit).toList(); - if (children.size() == 1) { - return children.getFirst(); - } - BooleanQuery.Builder builder = new BooleanQuery.Builder(); - for (Query child : children) { - builder.add(child, BooleanClause.Occur.MUST); - } - return builder.build(); + public String visitImplicitAndExpression(SearchParser.ImplicitAndExpressionContext ctx) { + List children = ctx.expression().stream().map(this::visit).toList(); + return children.size() == 1 ? children.getFirst() : String.join(" ", children); } @Override - public Query visitParenExpression(SearchParser.ParenExpressionContext ctx) { - return visit(ctx.andExpression()); + public String visitParenExpression(SearchParser.ParenExpressionContext ctx) { + String expr = visit(ctx.andExpression()); + return expr.isEmpty() ? "" : "(" + expr + ")"; } @Override - public Query visitNegatedExpression(SearchParser.NegatedExpressionContext ctx) { - Query innerQuery = visit(ctx.expression()); - if (innerQuery instanceof MatchNoDocsQuery) { - return innerQuery; - } - BooleanQuery.Builder builder = new BooleanQuery.Builder(); - builder.add(innerQuery, BooleanClause.Occur.MUST_NOT); - return builder.build(); + public String visitNegatedExpression(SearchParser.NegatedExpressionContext ctx) { + return "NOT (" + visit(ctx.expression()) + ")"; } @Override - public Query visitBinaryExpression(SearchParser.BinaryExpressionContext ctx) { - Query left = visit(ctx.left); - Query right = visit(ctx.right); + public String visitBinaryExpression(SearchParser.BinaryExpressionContext ctx) { + String left = visit(ctx.left); + String right = visit(ctx.right); - if (left instanceof MatchNoDocsQuery) { + if (left.isEmpty() && right.isEmpty()) { + return ""; + } + if (left.isEmpty()) { return right; } - if (right instanceof MatchNoDocsQuery) { + if (right.isEmpty()) { return left; } - BooleanQuery.Builder builder = new BooleanQuery.Builder(); + String operator = ctx.bin_op.getType() == SearchParser.AND ? " AND " : " OR "; + return left + operator + right; + } + + @Override + public String visitComparison(SearchParser.ComparisonContext ctx) { + String term = SearchQueryConversion.unescapeSearchValue(ctx.searchValue()); + boolean isQuoted = ctx.searchValue().getStart().getType() == SearchParser.STRING_LITERAL; + + // unfielded expression + if (ctx.FIELD() == null) { + if (searchFlags.contains(SearchFlags.REGULAR_EXPRESSION)) { + return "/" + term + "/"; + } + return isQuoted ? "\"" + escapeQuotes(term) + "\"" : QueryParser.escape(term); + } - if (ctx.bin_op.getType() == SearchParser.AND) { - builder.add(left, BooleanClause.Occur.MUST); - builder.add(right, BooleanClause.Occur.MUST); - } else if (ctx.bin_op.getType() == SearchParser.OR) { - builder.add(left, BooleanClause.Occur.SHOULD); - builder.add(right, BooleanClause.Occur.SHOULD); + String field = ctx.FIELD().getText().toLowerCase(Locale.ROOT); + if (!isValidField(field)) { + return ""; } - return builder.build(); + field = "any".equals(field) || "anyfield".equals(field) ? "" : field + ":"; + int operator = ctx.operator().getStart().getType(); + return buildFieldExpression(field, term, operator, isQuoted); } - @Override - public Query visitComparisonExpression(SearchParser.ComparisonExpressionContext ctx) { - return visit(ctx.comparison()); + private boolean isValidField(String field) { + return "any".equals(field) || "anyfield".equals(field) || LinkedFilesConstants.PDF_FIELDS.contains(field); } - @Override - public Query visitComparison(SearchParser.ComparisonContext ctx) { - String field = ctx.FIELD() == null ? null : ctx.FIELD().getText(); - String term = SearchQueryConversion.unescapeSearchValue(ctx.searchValue()); + private String buildFieldExpression(String field, String term, int operator, boolean isQuoted) { + boolean isRegexOp = isRegexOperator(operator); + boolean isNegationOp = isNegationOperator(operator); - // unfielded expression - if (field == null || "anyfield".equals(field) || "any".equals(field)) { - return createMultiFieldQuery(term, ctx.operator()); - } else if (SEARCH_FIELDS.contains(field)) { - return createFieldQuery(field, term, ctx.operator()); + if (isRegexOp) { + String expression = field + "/" + term + "/"; + return isNegationOp ? "NOT " + expression : expression; } else { - return new MatchNoDocsQuery(); + term = isQuoted ? "\"" + escapeQuotes(term) + "\"" : QueryParser.escape(term); + String expression = field + term; + return isNegationOp ? "NOT " + expression : expression; } } - private Query createMultiFieldQuery(String value, SearchParser.OperatorContext operator) { - BooleanQuery.Builder builder = new BooleanQuery.Builder(); - for (String field : SEARCH_FIELDS) { - builder.add(createFieldQuery(field, value, operator), BooleanClause.Occur.SHOULD); - } - return builder.build(); + private static String escapeQuotes(String term) { + return term.replace("\"", "\\\""); } - private Query createFieldQuery(String field, String value, SearchParser.OperatorContext operator) { - if (operator == null) { - return createTermOrPhraseQuery(field, value); - } - - return switch (operator.getStart().getType()) { - case SearchParser.REQUAL, - SearchParser.CREEQUAL -> - new RegexpQuery(new Term(field, value)); + private static boolean isNegationOperator(int operator) { + return switch (operator) { case SearchParser.NEQUAL, SearchParser.NCEQUAL, SearchParser.NEEQUAL, - SearchParser.NCEEQUAL -> - createNegatedQuery(createTermOrPhraseQuery(field, value)); - case SearchParser.NREQUAL, - SearchParser.NCREEQUAL -> - createNegatedQuery(new RegexpQuery(new Term(field, value))); - default -> - createTermOrPhraseQuery(field, value); + SearchParser.NCEEQUAL, + SearchParser.NREQUAL, + SearchParser.NCREEQUAL -> true; + default -> false; }; } - private Query createNegatedQuery(Query query) { - BooleanQuery.Builder negatedQuery = new BooleanQuery.Builder(); - negatedQuery.add(query, BooleanClause.Occur.MUST_NOT); - return negatedQuery.build(); - } - - private Query createTermOrPhraseQuery(String field, String value) { - if (value.contains("*") || value.contains("?")) { - return new TermQuery(new Term(field, value)); - } - return queryBuilder.createPhraseQuery(field, value); + private static boolean isRegexOperator(int operator) { + return switch (operator) { + case SearchParser.REQUAL, + SearchParser.CREEQUAL, + SearchParser.NREQUAL, + SearchParser.NCREEQUAL -> true; + default -> false; + }; } } diff --git a/src/main/java/org/jabref/logic/search/retrieval/LinkedFilesSearcher.java b/src/main/java/org/jabref/logic/search/retrieval/LinkedFilesSearcher.java index 5b2a93047fe..1e3e47a11b4 100644 --- a/src/main/java/org/jabref/logic/search/retrieval/LinkedFilesSearcher.java +++ b/src/main/java/org/jabref/logic/search/retrieval/LinkedFilesSearcher.java @@ -22,6 +22,9 @@ import org.apache.lucene.document.Document; import org.apache.lucene.index.StoredFields; +import org.apache.lucene.queryparser.classic.MultiFieldQueryParser; +import org.apache.lucene.queryparser.classic.ParseException; +import org.apache.lucene.queryparser.classic.QueryParser; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.Query; import org.apache.lucene.search.ScoreDoc; @@ -39,11 +42,14 @@ public final class LinkedFilesSearcher { private final FilePreferences filePreferences; private final BibDatabaseContext databaseContext; private final SearcherManager searcherManager; + private final MultiFieldQueryParser parser; public LinkedFilesSearcher(BibDatabaseContext databaseContext, LuceneIndexer linkedFilesIndexer, FilePreferences filePreferences) { this.searcherManager = linkedFilesIndexer.getSearcherManager(); this.databaseContext = databaseContext; this.filePreferences = filePreferences; + this.parser = new MultiFieldQueryParser(LinkedFilesConstants.PDF_FIELDS.toArray(new String[0]), LinkedFilesConstants.LINKED_FILES_ANALYZER); + parser.setDefaultOperator(QueryParser.Operator.AND); } public SearchResults search(SearchQuery searchQuery) { @@ -51,17 +57,21 @@ public SearchResults search(SearchQuery searchQuery) { return new SearchResults(); } - Query luceneQuery = SearchQueryConversion.searchToLucene(searchQuery); + Optional luceneQuery = getLuceneQuery(searchQuery); + if (luceneQuery.isEmpty()) { + return new SearchResults(); + } + EnumSet searchFlags = searchQuery.getSearchFlags(); boolean shouldSearchInLinkedFiles = searchFlags.contains(SearchFlags.FULLTEXT) && filePreferences.shouldFulltextIndexLinkedFiles(); if (!shouldSearchInLinkedFiles) { return new SearchResults(); } - LOGGER.debug("Searching in linked files with query: {}", luceneQuery); + LOGGER.debug("Searching in linked files with query: {}", luceneQuery.get()); try { IndexSearcher linkedFilesIndexSearcher = acquireIndexSearcher(searcherManager); - SearchResults searchResults = search(linkedFilesIndexSearcher, luceneQuery); + SearchResults searchResults = search(linkedFilesIndexSearcher, luceneQuery.get()); releaseIndexSearcher(searcherManager, linkedFilesIndexSearcher); return searchResults; } catch (IOException | IndexSearcher.TooManyClauses e) { @@ -70,6 +80,16 @@ public SearchResults search(SearchQuery searchQuery) { return new SearchResults(); } + private Optional getLuceneQuery(SearchQuery searchQuery) { + String query = SearchQueryConversion.searchToLucene(searchQuery); + try { + return Optional.of(parser.parse(query)); + } catch (ParseException e) { + LOGGER.error("Error during query parsing", e); + return Optional.empty(); + } + } + private SearchResults search(IndexSearcher indexSearcher, Query searchQuery) throws IOException { TopDocs topDocs = indexSearcher.search(searchQuery, Integer.MAX_VALUE); StoredFields storedFields = indexSearcher.storedFields(); diff --git a/src/main/java/org/jabref/model/database/BibDatabaseContext.java b/src/main/java/org/jabref/model/database/BibDatabaseContext.java index c09138a978d..bf4aa5154d8 100644 --- a/src/main/java/org/jabref/model/database/BibDatabaseContext.java +++ b/src/main/java/org/jabref/model/database/BibDatabaseContext.java @@ -40,7 +40,6 @@ public class BibDatabaseContext { private static final Logger LOGGER = LoggerFactory.getLogger(BibDatabaseContext.class); - private static int NUMBER_OF_UNSAVED_LIBRARIES = 0; private final BibDatabase database; private MetaData metaData; @@ -275,14 +274,6 @@ public Path getFulltextIndexPath() { return indexPath; } - public String getUniqueName() { - if (getDatabasePath().isPresent()) { - Path databasePath = getDatabasePath().get(); - return BackupFileUtil.getUniqueFilePrefix(databasePath) + "--" + databasePath.getFileName(); - } - return "unsaved" + NUMBER_OF_UNSAVED_LIBRARIES++; - } - @Override public String toString() { return "BibDatabaseContext{" + diff --git a/src/main/java/org/jabref/model/search/PostgreConstants.java b/src/main/java/org/jabref/model/search/PostgreConstants.java index 811d3e7d9af..e2cf9d07904 100644 --- a/src/main/java/org/jabref/model/search/PostgreConstants.java +++ b/src/main/java/org/jabref/model/search/PostgreConstants.java @@ -5,7 +5,7 @@ public enum PostgreConstants { BIB_FIELDS_SCHEME("bib_fields"), SPLIT_TABLE_SUFFIX("_split_values"), - ENTRY_ID("entry_id"), + ENTRY_ID("entryid"), FIELD_NAME("field_name"), FIELD_VALUE_LITERAL("field_value_literal"), // contains the value as-is FIELD_VALUE_TRANSFORMED("field_value_transformed"); // contains the value transformed for better querying diff --git a/src/test/java/org/jabref/logic/search/query/SearchQueryExtractorConversionTest.java b/src/test/java/org/jabref/logic/search/query/SearchQueryExtractorConversionTest.java index bdd4340f583..e6d9498fb59 100644 --- a/src/test/java/org/jabref/logic/search/query/SearchQueryExtractorConversionTest.java +++ b/src/test/java/org/jabref/logic/search/query/SearchQueryExtractorConversionTest.java @@ -26,7 +26,8 @@ public static Stream searchConversion() { Arguments.of(List.of(), "NOT a"), Arguments.of(List.of("a", "b", "c"), "(any = a OR any = b) AND NOT (NOT c AND title = d)"), Arguments.of(List.of("b", "c"), "title != a OR b OR c"), - Arguments.of(List.of("a", "b"), "a b") + Arguments.of(List.of("a", "b"), "a b"), + Arguments.of(List.of("term1 term2"), "\"term1 term2\"") ); } diff --git a/src/test/java/org/jabref/logic/search/query/SearchQueryLuceneConversionTest.java b/src/test/java/org/jabref/logic/search/query/SearchQueryLuceneConversionTest.java index 992cdd7dca5..7936a99b555 100644 --- a/src/test/java/org/jabref/logic/search/query/SearchQueryLuceneConversionTest.java +++ b/src/test/java/org/jabref/logic/search/query/SearchQueryLuceneConversionTest.java @@ -14,53 +14,55 @@ class SearchQueryLuceneConversionTest { public static Stream searchConversion() { return Stream.of( - Arguments.of("content:term annotations:term", "term"), - Arguments.of("content:term annotations:term", "any = term"), - Arguments.of("content:term annotations:term", "any CONTAINS term"), - Arguments.of("content:term annotations:term", "any MATCHES term"), - Arguments.of("content:term annotations:term", "any =! term"), - Arguments.of("content:term annotations:term", "any == term"), - Arguments.of("content:term annotations:term", "any ==! term"), + Arguments.of("a", "a"), + Arguments.of("the", "the"), + Arguments.of("term", "term"), + Arguments.of("term", "any = term"), + Arguments.of("term", "any CONTAINS term"), + Arguments.of("term", "any MATCHES term"), + Arguments.of("term", "any =! term"), + Arguments.of("term", "any == term"), + Arguments.of("term", "any ==! term"), - Arguments.of("content:\"two term\" annotations:\"two term\"", "\"two terms\""), - Arguments.of("content:\"two term\" annotations:\"two term\"", "any = \"two terms\""), + Arguments.of("\"two terms\"", "\"two terms\""), + Arguments.of("\"two terms\"", "any = \"two terms\""), + Arguments.of("NOT (term)", "NOT term"), - Arguments.of("content:imag", "content = image"), - Arguments.of("annotations:imag", "annotations = image"), - Arguments.of("content:\"imag process\"", "content = \"image processing\""), - Arguments.of("+content:imag +annotations:process", "content = image AND annotations = processing"), - Arguments.of("+(content:imag annotations:process) +(content:term annotations:term)", "(content = image OR annotations = processing) AND term"), - Arguments.of("(content:on annotations:on) (+(content:two annotations:two) +(content:three annotations:three))", "one OR (two AND three)"), + Arguments.of("content:image", "content = image"), + Arguments.of("annotations:image", "annotations = image"), + Arguments.of("content:\"image processing\"", "content = \"image processing\""), + Arguments.of("content:image AND annotations:processing", "content = image AND annotations = processing"), + Arguments.of("(content:image OR annotations:processing) AND term", "(content = image OR annotations = processing) AND term"), + Arguments.of("one OR (two AND three)", "one OR (two AND three)"), - Arguments.of("(-content:term) (-annotations:term)", "any != term"), - Arguments.of("(-content:term) (-annotations:term)", "any !== term"), - Arguments.of("(-content:term) (-annotations:term)", "any !=! term"), - Arguments.of("(-content:\"two term\") (-annotations:\"two term\")", "any != \"two terms\""), - Arguments.of("+(-content:imag) +(-annotations:process)", "content != image AND annotations != processing"), + Arguments.of("NOT term", "any != term"), + Arguments.of("NOT term", "any !== term"), + Arguments.of("NOT term", "any !=! term"), + Arguments.of("NOT \"two terms\"", "any != \"two terms\""), + Arguments.of("content:image AND NOT annotations:processing", "content = image AND annotations != processing"), - Arguments.of("MatchNoDocsQuery(\"\")", "title = image"), - Arguments.of("content:\"imag process\" annotations:\"imag process\"", "\"image processing\" AND author = smith"), - Arguments.of("+(content:imag annotations:imag) +(content:process annotations:process)", "image AND (title = term OR processing)"), - Arguments.of("(content:imag annotations:imag) (content:process annotations:process)", "image OR (title = term OR processing)"), - Arguments.of("MatchNoDocsQuery(\"\")", "title = \"image processing\" AND author = smith"), + // ignore non pdf fields + Arguments.of("", "title = image"), + Arguments.of("\"image processing\"", "\"image processing\" AND author = smith"), + Arguments.of("image AND (processing)", "image AND (title = term OR processing)"), + Arguments.of("image OR (processing)", "image OR (title = term OR processing)"), + Arguments.of("", "title = \"image processing\" AND author = smith"), - Arguments.of("content:neighbou?r annotations:neighbou?r", "neighbou?r"), - Arguments.of("content:neighbo* annotations:neighbo*", "neighbo*"), - Arguments.of("MatchNoDocsQuery(\"\")", "title = neighbou?r"), - Arguments.of("MatchNoDocsQuery(\"\")", "(title == chocolate) OR (author == smith)"), + Arguments.of("neighbou\\?r", "neighbou?r"), + Arguments.of("neighbo\\*", "neighbo*"), + Arguments.of("", "title = neighbou?r"), + Arguments.of("", "(title == chocolate) OR (author == smith)"), - Arguments.of("content:/(John|Doe).+(John|Doe)/ annotations:/(John|Doe).+(John|Doe)/", "any =~ \"(John|Doe).+(John|Doe)\""), - Arguments.of("content:/rev*/ annotations:/rev*/", "anyfield=~ rev*"), - Arguments.of("content:/*rev*/ annotations:/*rev*/", "anyfield=~ *rev*"), - Arguments.of("(-content:/.+/) (-annotations:/.+/)", "any !=~ .+"), - Arguments.of("(-content:/.+/) (-annotations:/.+/)", "groups !=~ .+ AND any !=~ .+") + // regex + Arguments.of("/(John|Doe).+(John|Doe)/", "any =~ \"(John|Doe).+(John|Doe)\""), + Arguments.of("/rev*/", "anyfield=~ rev*"), + Arguments.of("NOT /.+/", "any !=~ .+") ); } @ParameterizedTest @MethodSource void searchConversion(String expected, String searchExpression) { - String result = SearchQueryConversion.searchToLucene(new SearchQuery(searchExpression)).toString(); - assertEquals(expected, result); + assertEquals(expected, SearchQueryConversion.searchToLucene(new SearchQuery(searchExpression))); } } 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 d207d25e2e4..87172feff1d 100644 --- a/src/test/java/org/jabref/logic/search/query/SearchQuerySQLConversionTest.java +++ b/src/test/java/org/jabref/logic/search/query/SearchQuerySQLConversionTest.java @@ -42,13 +42,13 @@ public static Stream searchConversion() { """ WITH cte0 AS ( - SELECT main_table.entry_id + SELECT main_table.entryid FROM bib_fields."tableName" AS main_table WHERE ( (main_table.field_name = 'author') AND ((main_table.field_value_literal ILIKE ('%smith%')) OR (main_table.field_value_transformed ILIKE ('%smith%'))) ) ) - SELECT * FROM cte0 GROUP BY entry_id""" + SELECT * FROM cte0 GROUP BY entryid""" ), Arguments.of( @@ -56,13 +56,13 @@ cte0 AS ( """ WITH cte0 AS ( - SELECT main_table.entry_id + SELECT main_table.entryid FROM bib_fields."tableName" AS main_table WHERE ( (main_table.field_name = 'author') AND ((main_table.field_value_literal ILIKE ('%smith%')) OR (main_table.field_value_transformed ILIKE ('%smith%'))) ) ) - SELECT * FROM cte0 GROUP BY entry_id""" + SELECT * FROM cte0 GROUP BY entryid""" ), Arguments.of( @@ -70,13 +70,13 @@ cte0 AS ( """ WITH cte0 AS ( - SELECT main_table.entry_id + SELECT main_table.entryid FROM bib_fields."tableName" AS main_table WHERE ( (main_table.field_name = 'author') AND ((main_table.field_value_literal LIKE ('%smith%')) OR (main_table.field_value_transformed LIKE ('%smith%'))) ) ) - SELECT * FROM cte0 GROUP BY entry_id""" + SELECT * FROM cte0 GROUP BY entryid""" ), Arguments.of( @@ -84,17 +84,17 @@ cte0 AS ( """ WITH cte0 AS ( - SELECT main_table.entry_id + SELECT main_table.entryid FROM bib_fields."tableName" AS main_table - WHERE main_table.entry_id NOT IN ( - SELECT inner_table.entry_id + WHERE main_table.entryid NOT IN ( + SELECT inner_table.entryid FROM bib_fields."tableName" AS inner_table WHERE ( (inner_table.field_name = 'author') AND ((inner_table.field_value_literal ILIKE ('%smith%')) OR (inner_table.field_value_transformed ILIKE ('%smith%'))) ) ) ) - SELECT * FROM cte0 GROUP BY entry_id""" + SELECT * FROM cte0 GROUP BY entryid""" ), Arguments.of( @@ -102,17 +102,17 @@ WHERE main_table.entry_id NOT IN ( """ WITH cte0 AS ( - SELECT main_table.entry_id + SELECT main_table.entryid FROM bib_fields."tableName" AS main_table - WHERE main_table.entry_id NOT IN ( - SELECT inner_table.entry_id + WHERE main_table.entryid NOT IN ( + SELECT inner_table.entryid FROM bib_fields."tableName" AS inner_table WHERE ( (inner_table.field_name = 'author') AND ((inner_table.field_value_literal LIKE ('%smith%')) OR (inner_table.field_value_transformed LIKE ('%smith%'))) ) ) ) - SELECT * FROM cte0 GROUP BY entry_id""" + SELECT * FROM cte0 GROUP BY entryid""" ), Arguments.of( @@ -120,17 +120,17 @@ WHERE main_table.entry_id NOT IN ( """ WITH cte0 AS ( - SELECT main_table.entry_id + SELECT main_table.entryid FROM bib_fields."tableName" AS main_table LEFT JOIN bib_fields."tableName_split_values" AS split_table - ON (main_table.entry_id = split_table.entry_id AND main_table.field_name = split_table.field_name) + ON (main_table.entryid = split_table.entryid AND main_table.field_name = split_table.field_name) WHERE ( ((main_table.field_name = 'author') AND ((main_table.field_value_literal ILIKE ('smith')) OR (main_table.field_value_transformed ILIKE ('smith')))) OR ((split_table.field_name = 'author') AND ((split_table.field_value_literal ILIKE ('smith')) OR (split_table.field_value_transformed ILIKE ('smith')))) ) ) - SELECT * FROM cte0 GROUP BY entry_id""" + SELECT * FROM cte0 GROUP BY entryid""" ), Arguments.of( @@ -138,17 +138,17 @@ cte0 AS ( """ WITH cte0 AS ( - SELECT main_table.entry_id + SELECT main_table.entryid FROM bib_fields."tableName" AS main_table LEFT JOIN bib_fields."tableName_split_values" AS split_table - ON (main_table.entry_id = split_table.entry_id AND main_table.field_name = split_table.field_name) + ON (main_table.entryid = split_table.entryid AND main_table.field_name = split_table.field_name) WHERE ( ((main_table.field_name = 'author') AND ((main_table.field_value_literal ILIKE ('smith')) OR (main_table.field_value_transformed ILIKE ('smith')))) OR ((split_table.field_name = 'author') AND ((split_table.field_value_literal ILIKE ('smith')) OR (split_table.field_value_transformed ILIKE ('smith')))) ) ) - SELECT * FROM cte0 GROUP BY entry_id""" + SELECT * FROM cte0 GROUP BY entryid""" ), Arguments.of( @@ -156,17 +156,17 @@ cte0 AS ( """ WITH cte0 AS ( - SELECT main_table.entry_id + SELECT main_table.entryid FROM bib_fields."tableName" AS main_table LEFT JOIN bib_fields."tableName_split_values" AS split_table - ON (main_table.entry_id = split_table.entry_id AND main_table.field_name = split_table.field_name) + ON (main_table.entryid = split_table.entryid AND main_table.field_name = split_table.field_name) WHERE ( ((main_table.field_name = 'author') AND ((main_table.field_value_literal LIKE ('smith')) OR (main_table.field_value_transformed LIKE ('smith')))) OR ((split_table.field_name = 'author') AND ((split_table.field_value_literal LIKE ('smith')) OR (split_table.field_value_transformed LIKE ('smith')))) ) ) - SELECT * FROM cte0 GROUP BY entry_id""" + SELECT * FROM cte0 GROUP BY entryid""" ), Arguments.of( @@ -174,13 +174,13 @@ cte0 AS ( """ WITH cte0 AS ( - SELECT main_table.entry_id + SELECT main_table.entryid FROM bib_fields."tableName" AS main_table - WHERE main_table.entry_id NOT IN ( - SELECT inner_table.entry_id + WHERE main_table.entryid NOT IN ( + SELECT inner_table.entryid FROM bib_fields."tableName" AS inner_table LEFT JOIN bib_fields."tableName_split_values" AS split_table - ON (inner_table.entry_id = split_table.entry_id AND inner_table.field_name = split_table.field_name) + ON (inner_table.entryid = split_table.entryid AND inner_table.field_name = split_table.field_name) WHERE ( ((inner_table.field_name = 'author') AND ((inner_table.field_value_literal ILIKE ('smith')) OR (inner_table.field_value_transformed ILIKE ('smith')))) OR @@ -188,7 +188,7 @@ WHERE main_table.entry_id NOT IN ( ) ) ) - SELECT * FROM cte0 GROUP BY entry_id""" + SELECT * FROM cte0 GROUP BY entryid""" ), Arguments.of( @@ -196,13 +196,13 @@ WHERE main_table.entry_id NOT IN ( """ WITH cte0 AS ( - SELECT main_table.entry_id + SELECT main_table.entryid FROM bib_fields."tableName" AS main_table - WHERE main_table.entry_id NOT IN ( - SELECT inner_table.entry_id + WHERE main_table.entryid NOT IN ( + SELECT inner_table.entryid FROM bib_fields."tableName" AS inner_table LEFT JOIN bib_fields."tableName_split_values" AS split_table - ON (inner_table.entry_id = split_table.entry_id AND inner_table.field_name = split_table.field_name) + ON (inner_table.entryid = split_table.entryid AND inner_table.field_name = split_table.field_name) WHERE ( ((inner_table.field_name = 'author') AND ((inner_table.field_value_literal LIKE ('smith')) OR (inner_table.field_value_transformed LIKE ('smith')))) OR @@ -210,7 +210,7 @@ WHERE main_table.entry_id NOT IN ( ) ) ) - SELECT * FROM cte0 GROUP BY entry_id""" + SELECT * FROM cte0 GROUP BY entryid""" ), Arguments.of( @@ -218,13 +218,13 @@ WHERE main_table.entry_id NOT IN ( """ WITH cte0 AS ( - SELECT main_table.entry_id + SELECT main_table.entryid FROM bib_fields."tableName" AS main_table WHERE ( (main_table.field_name = 'author') AND ((main_table.field_value_literal ~* ('smith')) OR (main_table.field_value_transformed ~* ('smith'))) ) ) - SELECT * FROM cte0 GROUP BY entry_id""" + SELECT * FROM cte0 GROUP BY entryid""" ), Arguments.of( @@ -232,13 +232,13 @@ cte0 AS ( """ WITH cte0 AS ( - SELECT main_table.entry_id + SELECT main_table.entryid FROM bib_fields."tableName" AS main_table WHERE ( (main_table.field_name = 'author') AND ((main_table.field_value_literal ~ ('smith')) OR (main_table.field_value_transformed ~ ('smith'))) ) ) - SELECT * FROM cte0 GROUP BY entry_id""" + SELECT * FROM cte0 GROUP BY entryid""" ), Arguments.of( @@ -246,17 +246,17 @@ cte0 AS ( """ WITH cte0 AS ( - SELECT main_table.entry_id + SELECT main_table.entryid FROM bib_fields."tableName" AS main_table - WHERE main_table.entry_id NOT IN ( - SELECT inner_table.entry_id + WHERE main_table.entryid NOT IN ( + SELECT inner_table.entryid FROM bib_fields."tableName" AS inner_table WHERE ( (inner_table.field_name = 'author') AND ((inner_table.field_value_literal ~* ('smith')) OR (inner_table.field_value_transformed ~* ('smith'))) ) ) ) - SELECT * FROM cte0 GROUP BY entry_id""" + SELECT * FROM cte0 GROUP BY entryid""" ), Arguments.of( @@ -264,17 +264,17 @@ WHERE main_table.entry_id NOT IN ( """ WITH cte0 AS ( - SELECT main_table.entry_id + SELECT main_table.entryid FROM bib_fields."tableName" AS main_table - WHERE main_table.entry_id NOT IN ( - SELECT inner_table.entry_id + WHERE main_table.entryid NOT IN ( + SELECT inner_table.entryid FROM bib_fields."tableName" AS inner_table WHERE ( (inner_table.field_name = 'author') AND ((inner_table.field_value_literal ~ ('smith')) OR (inner_table.field_value_transformed ~ ('smith'))) ) ) ) - SELECT * FROM cte0 GROUP BY entry_id""" + SELECT * FROM cte0 GROUP BY entryid""" ), Arguments.of( @@ -282,13 +282,13 @@ WHERE main_table.entry_id NOT IN ( """ WITH cte0 AS ( - SELECT main_table.entry_id + SELECT main_table.entryid FROM bib_fields."tableName" AS main_table WHERE ( (main_table.field_name != 'groups') AND ((main_table.field_value_literal ILIKE ('%smith%')) OR (main_table.field_value_transformed ILIKE ('%smith%'))) ) ) - SELECT * FROM cte0 GROUP BY entry_id""" + SELECT * FROM cte0 GROUP BY entryid""" ), Arguments.of( @@ -296,10 +296,10 @@ cte0 AS ( """ WITH cte0 AS ( - SELECT main_table.entry_id + SELECT main_table.entryid FROM bib_fields."tableName" AS main_table LEFT JOIN bib_fields."tableName_split_values" AS split_table - ON (main_table.entry_id = split_table.entry_id AND main_table.field_name = split_table.field_name) + ON (main_table.entryid = split_table.entryid AND main_table.field_name = split_table.field_name) WHERE ( (main_table.field_name != 'groups') AND ( @@ -309,7 +309,7 @@ cte0 AS ( ) ) ) - SELECT * FROM cte0 GROUP BY entry_id""" + SELECT * FROM cte0 GROUP BY entryid""" ), Arguments.of( @@ -317,17 +317,17 @@ cte0 AS ( """ WITH cte0 AS ( - SELECT main_table.entry_id + SELECT main_table.entryid FROM bib_fields."tableName" AS main_table - WHERE main_table.entry_id NOT IN ( - SELECT inner_table.entry_id + WHERE main_table.entryid NOT IN ( + SELECT inner_table.entryid FROM bib_fields."tableName" AS inner_table WHERE ( (inner_table.field_name != 'groups') AND ((inner_table.field_value_literal ILIKE ('%smith%')) OR (inner_table.field_value_transformed ILIKE ('%smith%'))) ) ) ) - SELECT * FROM cte0 GROUP BY entry_id""" + SELECT * FROM cte0 GROUP BY entryid""" ), Arguments.of( @@ -335,13 +335,13 @@ WHERE main_table.entry_id NOT IN ( """ WITH cte0 AS ( - SELECT main_table.entry_id + SELECT main_table.entryid FROM bib_fields."tableName" AS main_table WHERE ( (main_table.field_name = 'title') AND ((main_table.field_value_literal ILIKE ('%computer science%')) OR (main_table.field_value_transformed ILIKE ('%computer science%'))) ) ) - SELECT * FROM cte0 GROUP BY entry_id""" + SELECT * FROM cte0 GROUP BY entryid""" ), Arguments.of( @@ -349,7 +349,7 @@ cte0 AS ( """ WITH cte0 AS ( - SELECT main_table.entry_id + SELECT main_table.entryid FROM bib_fields."tableName" AS main_table WHERE ( (main_table.field_name != 'groups') AND ((main_table.field_value_literal ILIKE ('%term1%')) OR (main_table.field_value_transformed ILIKE ('%term1%'))) @@ -357,7 +357,7 @@ cte0 AS ( ) , cte1 AS ( - SELECT main_table.entry_id + SELECT main_table.entryid FROM bib_fields."tableName" AS main_table WHERE ( (main_table.field_name != 'groups') AND ((main_table.field_value_literal ILIKE ('%term2%')) OR (main_table.field_value_transformed ILIKE ('%term2%'))) @@ -365,7 +365,7 @@ cte1 AS ( ) , cte2 AS ( - SELECT main_table.entry_id + SELECT main_table.entryid FROM bib_fields."tableName" AS main_table WHERE ( (main_table.field_name != 'groups') AND ((main_table.field_value_literal ILIKE ('%term3%')) OR (main_table.field_value_transformed ILIKE ('%term3%'))) @@ -373,13 +373,13 @@ cte2 AS ( ) , cte3 AS ( - SELECT entry_id FROM cte0 + SELECT entryid FROM cte0 INTERSECT - SELECT entry_id FROM cte1 + SELECT entryid FROM cte1 INTERSECT - SELECT entry_id FROM cte2 + SELECT entryid FROM cte2 ) - SELECT * FROM cte3 GROUP BY entry_id""" + SELECT * FROM cte3 GROUP BY entryid""" ), Arguments.of( @@ -387,7 +387,7 @@ cte3 AS ( """ WITH cte0 AS ( - SELECT main_table.entry_id + SELECT main_table.entryid FROM bib_fields."tableName" AS main_table WHERE ( (main_table.field_name != 'groups') AND ((main_table.field_value_literal ILIKE ('%a%')) OR (main_table.field_value_transformed ILIKE ('%a%'))) @@ -395,7 +395,7 @@ cte0 AS ( ) , cte1 AS ( - SELECT main_table.entry_id + SELECT main_table.entryid FROM bib_fields."tableName" AS main_table WHERE ( (main_table.field_name != 'groups') AND ((main_table.field_value_literal ILIKE ('%b%')) OR (main_table.field_value_transformed ILIKE ('%b%'))) @@ -403,7 +403,7 @@ cte1 AS ( ) , cte2 AS ( - SELECT main_table.entry_id + SELECT main_table.entryid FROM bib_fields."tableName" AS main_table WHERE ( (main_table.field_name != 'groups') AND ((main_table.field_value_literal ILIKE ('%c%')) OR (main_table.field_value_transformed ILIKE ('%c%'))) @@ -411,21 +411,21 @@ cte2 AS ( ) , cte3 AS ( - SELECT entry_id + SELECT entryid FROM cte1 INTERSECT - SELECT entry_id + SELECT entryid FROM cte2 ) , cte4 AS ( - SELECT entry_id + SELECT entryid FROM cte0 UNION - SELECT entry_id + SELECT entryid FROM cte3 ) - SELECT * FROM cte4 GROUP BY entry_id""" + SELECT * FROM cte4 GROUP BY entryid""" ), Arguments.of( @@ -433,7 +433,7 @@ cte4 AS ( """ WITH cte0 AS ( - SELECT main_table.entry_id + SELECT main_table.entryid FROM bib_fields."tableName" AS main_table WHERE ( (main_table.field_name != 'groups') AND ((main_table.field_value_literal ILIKE ('%a%')) OR (main_table.field_value_transformed ILIKE ('%a%'))) @@ -441,7 +441,7 @@ cte0 AS ( ) , cte1 AS ( - SELECT main_table.entry_id + SELECT main_table.entryid FROM bib_fields."tableName" AS main_table WHERE ( (main_table.field_name != 'groups') AND ((main_table.field_value_literal ILIKE ('%b%')) OR (main_table.field_value_transformed ILIKE ('%b%'))) @@ -449,15 +449,15 @@ cte1 AS ( ) , cte2 AS ( - SELECT entry_id + SELECT entryid FROM cte0 INTERSECT - SELECT entry_id + SELECT entryid FROM cte1 ) , cte3 AS ( - SELECT main_table.entry_id + SELECT main_table.entryid FROM bib_fields."tableName" AS main_table WHERE ( (main_table.field_name != 'groups') AND ((main_table.field_value_literal ILIKE ('%c%')) OR (main_table.field_value_transformed ILIKE ('%c%'))) @@ -465,13 +465,13 @@ cte3 AS ( ) , cte4 AS ( - SELECT entry_id + SELECT entryid FROM cte2 UNION - SELECT entry_id + SELECT entryid FROM cte3 ) - SELECT * FROM cte4 GROUP BY entry_id""" + SELECT * FROM cte4 GROUP BY entryid""" ), Arguments.of( @@ -479,7 +479,7 @@ cte4 AS ( """ WITH cte0 AS ( - SELECT main_table.entry_id + SELECT main_table.entryid FROM bib_fields."tableName" AS main_table WHERE ( (main_table.field_name != 'groups') AND ((main_table.field_value_literal ILIKE ('%a%')) OR (main_table.field_value_transformed ILIKE ('%a%'))) @@ -487,7 +487,7 @@ cte0 AS ( ) , cte1 AS ( - SELECT main_table.entry_id + SELECT main_table.entryid FROM bib_fields."tableName" AS main_table WHERE ( (main_table.field_name != 'groups') AND ((main_table.field_value_literal ILIKE ('%b%')) OR (main_table.field_value_transformed ILIKE ('%b%'))) @@ -495,15 +495,15 @@ cte1 AS ( ) , cte2 AS ( - SELECT entry_id + SELECT entryid FROM cte0 UNION - SELECT entry_id + SELECT entryid FROM cte1 ) , cte3 AS ( - SELECT main_table.entry_id + SELECT main_table.entryid FROM bib_fields."tableName" AS main_table WHERE ( (main_table.field_name != 'groups') AND ((main_table.field_value_literal ILIKE ('%c%')) OR (main_table.field_value_transformed ILIKE ('%c%'))) @@ -511,13 +511,13 @@ cte3 AS ( ) , cte4 AS ( - SELECT entry_id + SELECT entryid FROM cte2 INTERSECT - SELECT entry_id + SELECT entryid FROM cte3 ) - SELECT * FROM cte4 GROUP BY entry_id""" + SELECT * FROM cte4 GROUP BY entryid""" ), Arguments.of( @@ -525,7 +525,7 @@ cte4 AS ( """ WITH cte0 AS ( - SELECT main_table.entry_id + SELECT main_table.entryid FROM bib_fields."tableName" AS main_table WHERE ( (main_table.field_name != 'groups') AND ((main_table.field_value_literal ILIKE ('%a%')) OR (main_table.field_value_transformed ILIKE ('%a%'))) @@ -533,7 +533,7 @@ cte0 AS ( ) , cte1 AS ( - SELECT main_table.entry_id + SELECT main_table.entryid FROM bib_fields."tableName" AS main_table WHERE ( (main_table.field_name != 'groups') AND ((main_table.field_value_literal ILIKE ('%b%')) OR (main_table.field_value_transformed ILIKE ('%b%'))) @@ -541,7 +541,7 @@ cte1 AS ( ) , cte2 AS ( - SELECT main_table.entry_id + SELECT main_table.entryid FROM bib_fields."tableName" AS main_table WHERE ( (main_table.field_name != 'groups') AND ((main_table.field_value_literal ILIKE ('%c%')) OR (main_table.field_value_transformed ILIKE ('%c%'))) @@ -549,21 +549,21 @@ cte2 AS ( ) , cte3 AS ( - SELECT entry_id + SELECT entryid FROM cte1 INTERSECT - SELECT entry_id + SELECT entryid FROM cte2 ) , cte4 AS ( - SELECT entry_id + SELECT entryid FROM cte0 UNION - SELECT entry_id + SELECT entryid FROM cte3 ) - SELECT * FROM cte4 GROUP BY entry_id""" + SELECT * FROM cte4 GROUP BY entryid""" ), Arguments.of( @@ -571,7 +571,7 @@ cte4 AS ( """ WITH cte0 AS ( - SELECT main_table.entry_id + SELECT main_table.entryid FROM bib_fields."tableName" AS main_table WHERE ( (main_table.field_name != 'groups') AND ((main_table.field_value_literal ILIKE ('%a%')) OR (main_table.field_value_transformed ILIKE ('%a%'))) @@ -579,7 +579,7 @@ cte0 AS ( ) , cte1 AS ( - SELECT main_table.entry_id + SELECT main_table.entryid FROM bib_fields."tableName" AS main_table WHERE ( (main_table.field_name != 'groups') AND ((main_table.field_value_literal ILIKE ('%b%')) OR (main_table.field_value_transformed ILIKE ('%b%'))) @@ -587,15 +587,15 @@ cte1 AS ( ) , cte2 AS ( - SELECT entry_id + SELECT entryid FROM cte0 UNION - SELECT entry_id + SELECT entryid FROM cte1 ) , cte3 AS ( - SELECT main_table.entry_id + SELECT main_table.entryid FROM bib_fields."tableName" AS main_table WHERE ( (main_table.field_name != 'groups') AND ((main_table.field_value_literal ILIKE ('%c%')) OR (main_table.field_value_transformed ILIKE ('%c%'))) @@ -603,7 +603,7 @@ cte3 AS ( ) , cte4 AS ( - SELECT main_table.entry_id + SELECT main_table.entryid FROM bib_fields."tableName" AS main_table WHERE ( (main_table.field_name != 'groups') AND ((main_table.field_value_literal ILIKE ('%d%')) OR (main_table.field_value_transformed ILIKE ('%d%'))) @@ -611,21 +611,21 @@ cte4 AS ( ) , cte5 AS ( - SELECT entry_id + SELECT entryid FROM cte3 UNION - SELECT entry_id + SELECT entryid FROM cte4 ) , cte6 AS ( - SELECT entry_id + SELECT entryid FROM cte2 INTERSECT - SELECT entry_id + SELECT entryid FROM cte5 ) - SELECT * FROM cte6 GROUP BY entry_id""" + SELECT * FROM cte6 GROUP BY entryid""" ), Arguments.of( @@ -633,7 +633,7 @@ cte6 AS ( """ WITH cte0 AS ( - SELECT main_table.entry_id + SELECT main_table.entryid FROM bib_fields."tableName" AS main_table WHERE ( (main_table.field_name != 'groups') AND ((main_table.field_value_literal ILIKE ('%a%')) OR (main_table.field_value_transformed ILIKE ('%a%'))) @@ -641,7 +641,7 @@ cte0 AS ( ) , cte1 AS ( - SELECT main_table.entry_id + SELECT main_table.entryid FROM bib_fields."tableName" AS main_table WHERE ( (main_table.field_name != 'groups') AND ((main_table.field_value_literal ILIKE ('%b%')) OR (main_table.field_value_transformed ILIKE ('%b%'))) @@ -649,7 +649,7 @@ cte1 AS ( ) , cte2 AS ( - SELECT main_table.entry_id + SELECT main_table.entryid FROM bib_fields."tableName" AS main_table WHERE ( (main_table.field_name != 'groups') AND ((main_table.field_value_literal ILIKE ('%c%')) OR (main_table.field_value_transformed ILIKE ('%c%'))) @@ -657,30 +657,30 @@ cte2 AS ( ) , cte3 AS ( - SELECT entry_id + SELECT entryid FROM cte1 UNION - SELECT entry_id + SELECT entryid FROM cte2 ) , cte4 AS ( - SELECT main_table.entry_id + SELECT main_table.entryid FROM bib_fields."tableName" AS main_table - WHERE main_table.entry_id NOT IN ( - SELECT entry_id + WHERE main_table.entryid NOT IN ( + SELECT entryid FROM cte3 ) ) , cte5 AS ( - SELECT entry_id + SELECT entryid FROM cte0 INTERSECT - SELECT entry_id + SELECT entryid FROM cte4 ) - SELECT * FROM cte5 GROUP BY entry_id""" + SELECT * FROM cte5 GROUP BY entryid""" ), Arguments.of( @@ -688,13 +688,13 @@ cte5 AS ( """ WITH cte0 AS ( - SELECT main_table.entry_id + SELECT main_table.entryid FROM bib_fields."tableName" AS main_table WHERE ( (main_table.field_name != 'groups') AND ((main_table.field_value_literal ILIKE ('%a''b%')) OR (main_table.field_value_transformed ILIKE ('%a''b%'))) ) ) - SELECT * FROM cte0 GROUP BY entry_id""" + SELECT * FROM cte0 GROUP BY entryid""" ) ); } @@ -722,13 +722,13 @@ public static Stream unFieldedTermsWithSearchBarFlags() { """ WITH cte0 AS ( - SELECT main_table.entry_id + SELECT main_table.entryid FROM bib_fields."tableName" AS main_table WHERE ( (main_table.field_name != 'groups') AND ((main_table.field_value_literal ILIKE ('%Test%')) OR (main_table.field_value_transformed ILIKE ('%Test%'))) ) ) - SELECT * FROM cte0 GROUP BY entry_id""" + SELECT * FROM cte0 GROUP BY entryid""" ), Arguments.of( @@ -737,13 +737,13 @@ cte0 AS ( """ WITH cte0 AS ( - SELECT main_table.entry_id + SELECT main_table.entryid FROM bib_fields."tableName" AS main_table WHERE ( (main_table.field_name != 'groups') AND ((main_table.field_value_literal LIKE ('%Test%')) OR (main_table.field_value_transformed LIKE ('%Test%'))) ) ) - SELECT * FROM cte0 GROUP BY entry_id""" + SELECT * FROM cte0 GROUP BY entryid""" ), Arguments.of( @@ -752,13 +752,13 @@ cte0 AS ( """ WITH cte0 AS ( - SELECT main_table.entry_id + SELECT main_table.entryid FROM bib_fields."tableName" AS main_table WHERE ( (main_table.field_name != 'groups') AND ((main_table.field_value_literal ~* ('Test')) OR (main_table.field_value_transformed ~* ('Test'))) ) ) - SELECT * FROM cte0 GROUP BY entry_id""" + SELECT * FROM cte0 GROUP BY entryid""" ), Arguments.of( @@ -767,13 +767,13 @@ cte0 AS ( """ WITH cte0 AS ( - SELECT main_table.entry_id + SELECT main_table.entryid FROM bib_fields."tableName" AS main_table WHERE ( (main_table.field_name != 'groups') AND ((main_table.field_value_literal ~ ('Test')) OR (main_table.field_value_transformed ~ ('Test'))) ) ) - SELECT * FROM cte0 GROUP BY entry_id""" + SELECT * FROM cte0 GROUP BY entryid""" ), Arguments.of( @@ -782,7 +782,7 @@ cte0 AS ( """ WITH cte0 AS ( - SELECT main_table.entry_id + SELECT main_table.entryid FROM bib_fields."tableName" AS main_table WHERE ( (main_table.field_name != 'groups') AND ((main_table.field_value_literal ILIKE ('%Test%')) OR (main_table.field_value_transformed ILIKE ('%Test%'))) @@ -790,7 +790,7 @@ cte0 AS ( ) , cte1 AS ( - SELECT main_table.entry_id + SELECT main_table.entryid FROM bib_fields."tableName" AS main_table WHERE ( (main_table.field_name = 'author') AND ((main_table.field_value_literal LIKE ('%Smith%')) OR (main_table.field_value_transformed LIKE ('%Smith%'))) @@ -798,13 +798,13 @@ cte1 AS ( ) , cte2 AS ( - SELECT entry_id + SELECT entryid FROM cte0 INTERSECT - SELECT entry_id + SELECT entryid FROM cte1 ) - SELECT * FROM cte2 GROUP BY entry_id""" + SELECT * FROM cte2 GROUP BY entryid""" ), Arguments.of( @@ -813,7 +813,7 @@ cte2 AS ( """ WITH cte0 AS ( - SELECT main_table.entry_id + SELECT main_table.entryid FROM bib_fields."tableName" AS main_table WHERE ( (main_table.field_name != 'groups') AND ((main_table.field_value_literal LIKE ('%Test%')) OR (main_table.field_value_transformed LIKE ('%Test%'))) @@ -821,7 +821,7 @@ cte0 AS ( ) , cte1 AS ( - SELECT main_table.entry_id + SELECT main_table.entryid FROM bib_fields."tableName" AS main_table WHERE ( (main_table.field_name = 'author') AND ((main_table.field_value_literal LIKE ('%Smith%')) OR (main_table.field_value_transformed LIKE ('%Smith%'))) @@ -829,13 +829,13 @@ cte1 AS ( ) , cte2 AS ( - SELECT entry_id + SELECT entryid FROM cte0 INTERSECT - SELECT entry_id + SELECT entryid FROM cte1 ) - SELECT * FROM cte2 GROUP BY entry_id""" + SELECT * FROM cte2 GROUP BY entryid""" ), Arguments.of( @@ -844,7 +844,7 @@ cte2 AS ( """ WITH cte0 AS ( - SELECT main_table.entry_id + SELECT main_table.entryid FROM bib_fields."tableName" AS main_table WHERE ( (main_table.field_name != 'groups') AND ((main_table.field_value_literal ~* ('Test')) OR (main_table.field_value_transformed ~* ('Test'))) @@ -852,7 +852,7 @@ cte0 AS ( ) , cte1 AS ( - SELECT main_table.entry_id + SELECT main_table.entryid FROM bib_fields."tableName" AS main_table WHERE ( (main_table.field_name = 'author') AND ((main_table.field_value_literal LIKE ('%Smith%')) OR (main_table.field_value_transformed LIKE ('%Smith%'))) @@ -860,13 +860,13 @@ cte1 AS ( ) , cte2 AS ( - SELECT entry_id + SELECT entryid FROM cte0 INTERSECT - SELECT entry_id + SELECT entryid FROM cte1 ) - SELECT * FROM cte2 GROUP BY entry_id""" + SELECT * FROM cte2 GROUP BY entryid""" ) ); } diff --git a/src/test/resources/org/jabref/logic/pseudonymization/Chocolate.bib b/src/test/resources/org/jabref/logic/pseudonymization/Chocolate.bib index 5fbb0f7af03..a6a676fc61e 100644 --- a/src/test/resources/org/jabref/logic/pseudonymization/Chocolate.bib +++ b/src/test/resources/org/jabref/logic/pseudonymization/Chocolate.bib @@ -214,11 +214,13 @@ @Comment{jabref-meta: @Comment{jabref-meta: grouping: 0 AllEntriesGroup:; -1 SearchGroup:Entries without a group\;0\;groups != .+\;0\;1\;1\;\;\;\;; -1 SearchGroup:Entries without a linked file\;0\;file != .+\;0\;1\;1\;\;\;\;; +1 SearchGroup:Entries without a group\;0\;groups !=~ .+\;0\;1\;1\;\;\;\;; +1 SearchGroup:Entries without a linked file\;0\;file !=~ .+\;0\;1\;1\;\;\;\;; 1 StaticGroup:Paywalled\;0\;1\;\;\;\;; -1 SearchGroup:To read\;0\;groups != .+ and readstatus != .+\;0\;1\;1\;0x008080ff\;\;\;; +1 SearchGroup:To read\;0\;groups !=~ .+ and readstatus !=~ .+\;0\;1\;1\;0x008080ff\;\;\;; 1 KeywordGroup:Skimmed\;0\;readstatus\;skimmed\;0\;0\;1\;0xffff00ff\;\;\;; 1 KeywordGroup:Read\;0\;readstatus\;read\;0\;0\;0\;0x00ff00ff\;\;\;; 1 StaticGroup:Used\;0\;1\;0x0000ffff\;\;\;; } + +@Comment{jabref-meta: groups-search-syntax-version:6.0-alpha_1} diff --git a/src/test/resources/testbib/Chocolate.bib b/src/test/resources/testbib/Chocolate.bib index 7a5301de470..5169c8f239c 100644 --- a/src/test/resources/testbib/Chocolate.bib +++ b/src/test/resources/testbib/Chocolate.bib @@ -210,13 +210,15 @@ @Comment{jabref-meta: @Comment{jabref-meta: grouping: 0 AllEntriesGroup:; -1 SearchGroup:Entries without a group\;0\;groups != .+\;0\;1\;1\;\;\;\;; -1 SearchGroup:Entries without a linked file\;0\;file != .+\;0\;1\;1\;\;\;\;; +1 SearchGroup:Entries without a group\;0\;groups !=~ .+\;0\;1\;1\;\;\;\;; +1 SearchGroup:Entries without a linked file\;0\;file !=~ .+\;0\;1\;1\;\;\;\;; 1 StaticGroup:Paywalled\;0\;1\;\;\;\;; -1 SearchGroup:To read\;0\;groups != .+ and readstatus != .+\;0\;1\;1\;0x008080ff\;\;\;; +1 SearchGroup:To read\;0\;groups !=~ .+ and readstatus !=~ .+\;0\;1\;1\;0x008080ff\;\;\;; 1 KeywordGroup:Skimmed\;0\;readstatus\;skimmed\;0\;0\;1\;0xffff00ff\;\;\;; 1 KeywordGroup:Read\;0\;readstatus\;read\;0\;0\;0\;0x00ff00ff\;\;\;; 1 StaticGroup:Used\;0\;1\;0x0000ffff\;\;\;; } +@Comment{jabref-meta: groups-search-syntax-version:6.0-alpha_1} + @Comment{jabref-meta: keypatterndefault:[auth]_[year];} diff --git a/src/test/resources/testbib/simple-search-library.bib b/src/test/resources/testbib/simple-search-library.bib index 9d4d58d4a7c..7e4cee0935c 100644 --- a/src/test/resources/testbib/simple-search-library.bib +++ b/src/test/resources/testbib/simple-search-library.bib @@ -68,3 +68,5 @@ @Comment{jabref-meta: 0 AllEntriesGroup:; 1 SearchGroup:g\;0\;g\;0\;0\;1\;\;\;\;; } + +@Comment{jabref-meta: groups-search-syntax-version:6.0-alpha_1}