Skip to content

Commit

Permalink
Ignores groups field from default searches
Browse files Browse the repository at this point in the history
Fixes #7996
  • Loading branch information
LoayGhreeb committed Oct 4, 2024
1 parent c1dd99a commit 9a35891
Showing 1 changed file with 90 additions and 70 deletions.
160 changes: 90 additions & 70 deletions src/main/java/org/jabref/logic/search/query/SearchToSqlVisitor.java
Original file line number Diff line number Diff line change
Expand Up @@ -29,13 +29,15 @@

/**
* Converts to a query processable by the scheme created by {@link BibFieldsIndexer}.
* Tests are located in {@link org.jabref.logic.search.query.SearchQuerySQLConversionTest}.
*/
public class SearchToSqlVisitor extends SearchBaseVisitor<String> {

private static final Logger LOGGER = LoggerFactory.getLogger(SearchToSqlVisitor.class);
private static final String MAIN_TABLE = "main_table";
private static final String SPLIT_TABLE = "split_table";
private static final String INNER_TABLE = "inner_table";
private static final String GROUPS_FIELD = StandardField.GROUPS.getName();

private final String mainTableName;
private final String splitValuesTableName;
Expand Down Expand Up @@ -70,12 +72,12 @@ public String visitUnaryExpression(SearchParser.UnaryExpressionContext ctx) {
String subQuery = visit(ctx.expression());
String cte = """
cte%d AS (
SELECT %s.%s
FROM %s AS %s
WHERE %s.%s NOT IN (
SELECT %s
FROM %s
)
SELECT %s.%s
FROM %s AS %s
WHERE %s.%s NOT IN (
SELECT %s
FROM %s
)
)
""".formatted(
cteCounter,
Expand All @@ -96,11 +98,11 @@ public String visitBinaryExpression(SearchParser.BinaryExpressionContext ctx) {

String cte = """
cte%d AS (
SELECT %s
FROM %s
%s
SELECT %s
FROM %s
SELECT %s
FROM %s
%s
SELECT %s
FROM %s
)
""".formatted(
cteCounter,
Expand Down Expand Up @@ -196,9 +198,9 @@ private String getFieldQueryNode(String field, String term, EnumSet<SearchTermFl
if (ENTRY_ID.toString().equals(field)) {
cte = """
cte%d AS (
SELECT %s
FROM %s
WHERE %s = '%s'
SELECT %s
FROM %s
WHERE %s = '%s'
)
""".formatted(
cteCounter,
Expand Down Expand Up @@ -232,9 +234,11 @@ private String getFieldQueryNode(String field, String term, EnumSet<SearchTermFl
private String buildContainsFieldQuery(String field, String operator, String prefixSuffix, String term) {
return """
cte%d AS (
SELECT %s.%s
FROM %s AS %s
WHERE (%s.%s = '%s') AND ((%s.%s %s '%s%s%s') OR (%s.%s %s '%s%s%s'))
SELECT %s.%s
FROM %s AS %s
WHERE (
(%s.%s = '%s') AND ((%s.%s %s '%s%s%s') OR (%s.%s %s '%s%s%s'))
)
)
""".formatted(
cteCounter,
Expand All @@ -253,12 +257,14 @@ private String buildContainsFieldQuery(String field, String operator, String pre
private String buildContainsNegationFieldQuery(String field, String operator, String prefixSuffix, String term) {
return """
cte%d AS (
SELECT %s.%s
FROM %s AS %s
WHERE %s.%s NOT IN (
SELECT %s.%s
FROM %s AS %s
WHERE (%s.%s = '%s') AND ((%s.%s %s '%s%s%s') OR (%s.%s %s '%s%s%s'))
WHERE %s.%s NOT IN (
SELECT %s.%s
FROM %s AS %s
WHERE (
(%s.%s = '%s') AND ((%s.%s %s '%s%s%s') OR (%s.%s %s '%s%s%s'))
)
)
)
""".formatted(
Expand All @@ -281,15 +287,15 @@ private String buildContainsNegationFieldQuery(String field, String operator, St
private String buildExactFieldQuery(String field, String operator, String term) {
return """
cte%d AS (
SELECT %s.%s
FROM %s AS %s
LEFT JOIN %s AS %s
ON (%s.%s = %s.%s AND %s.%s = %s.%s)
WHERE (
(%s.%s = '%s') AND ((%s.%s %s '%s') OR (%s.%s %s '%s'))
OR
(%s.%s = '%s') AND ((%s.%s %s '%s') OR (%s.%s %s '%s'))
)
SELECT %s.%s
FROM %s AS %s
LEFT JOIN %s AS %s
ON (%s.%s = %s.%s AND %s.%s = %s.%s)
WHERE (
((%s.%s = '%s') AND ((%s.%s %s '%s') OR (%s.%s %s '%s')))
OR
((%s.%s = '%s') AND ((%s.%s %s '%s') OR (%s.%s %s '%s')))
)
)
""".formatted(
cteCounter,
Expand All @@ -309,19 +315,19 @@ private String buildExactFieldQuery(String field, String operator, String term)
private String buildExactNegationFieldQuery(String field, String operator, String term) {
return """
cte%d AS (
SELECT %s.%s
FROM %s AS %s
WHERE %s.%s NOT IN (
SELECT %s.%s
FROM %s AS %s
LEFT JOIN %s AS %s
ON (%s.%s = %s.%s AND %s.%s = %s.%s)
WHERE (
(%s.%s = '%s') AND ((%s.%s %s '%s') OR (%s.%s %s '%s'))
OR
(%s.%s = '%s') AND ((%s.%s %s '%s') OR (%s.%s %s '%s'))
WHERE %s.%s NOT IN (
SELECT %s.%s
FROM %s AS %s
LEFT JOIN %s AS %s
ON (%s.%s = %s.%s AND %s.%s = %s.%s)
WHERE (
((%s.%s = '%s') AND ((%s.%s %s '%s') OR (%s.%s %s '%s')))
OR
((%s.%s = '%s') AND ((%s.%s %s '%s') OR (%s.%s %s '%s')))
)
)
)
)
""".formatted(
cteCounter,
Expand All @@ -344,14 +350,17 @@ private String buildExactNegationFieldQuery(String field, String operator, Strin
private String buildContainsAnyFieldQuery(String operator, String prefixSuffix, String term) {
return """
cte%d AS (
SELECT %s.%s
FROM %s AS %s
WHERE ((%s.%s %s '%s%s%s') OR (%s.%s %s '%s%s%s'))
SELECT %s.%s
FROM %s AS %s
WHERE (
(%s.%s != '%s') AND ((%s.%s %s '%s%s%s') OR (%s.%s %s '%s%s%s'))
)
)
""".formatted(
cteCounter,
MAIN_TABLE, ENTRY_ID,
mainTableName, MAIN_TABLE,
MAIN_TABLE, FIELD_NAME, GROUPS_FIELD, // https://github.com/JabRef/jabref/issues/7996
MAIN_TABLE, FIELD_VALUE_LITERAL,
operator,
prefixSuffix, term, prefixSuffix,
Expand All @@ -363,15 +372,18 @@ private String buildContainsAnyFieldQuery(String operator, String prefixSuffix,
private String buildExactAnyFieldQuery(String operator, String term) {
return """
cte%d AS (
SELECT %s.%s
FROM %s AS %s
LEFT JOIN %s AS %s
ON (%s.%s = %s.%s AND %s.%s = %s.%s)
WHERE (
(%s.%s %s '%s') OR (%s.%s %s '%s')
OR
(%s.%s %s '%s') OR (%s.%s %s '%s')
)
SELECT %s.%s
FROM %s AS %s
LEFT JOIN %s AS %s
ON (%s.%s = %s.%s AND %s.%s = %s.%s)
WHERE (
(%s.%s != '%s')
AND (
((%s.%s %s '%s') OR (%s.%s %s '%s'))
OR
((%s.%s %s '%s') OR (%s.%s %s '%s'))
)
)
)
""".formatted(
cteCounter,
Expand All @@ -380,6 +392,7 @@ private String buildExactAnyFieldQuery(String operator, String term) {
splitValuesTableName, SPLIT_TABLE,
MAIN_TABLE, ENTRY_ID, SPLIT_TABLE, ENTRY_ID,
MAIN_TABLE, FIELD_NAME, SPLIT_TABLE, FIELD_NAME,
MAIN_TABLE, FIELD_NAME, GROUPS_FIELD, // https://github.com/JabRef/jabref/issues/7996
MAIN_TABLE, FIELD_VALUE_LITERAL, operator, term,
MAIN_TABLE, FIELD_VALUE_TRANSFORMED, operator, term,
SPLIT_TABLE, FIELD_VALUE_LITERAL, operator, term,
Expand All @@ -389,19 +402,22 @@ private String buildExactAnyFieldQuery(String operator, String term) {
private String buildExactNegationAnyFieldQuery(String operator, String term) {
return """
cte%d AS (
SELECT %s.%s
FROM %s AS %s
WHERE %s.%s NOT IN (
SELECT %s.%s
FROM %s AS %s
LEFT JOIN %s AS %s
ON (%s.%s = %s.%s AND %s.%s = %s.%s)
WHERE (
(%s.%s %s '%s') OR (%s.%s %s '%s')
OR
(%s.%s %s '%s') OR (%s.%s %s '%s')
WHERE %s.%s NOT IN (
SELECT %s.%s
FROM %s AS %s
LEFT JOIN %s AS %s
ON (%s.%s = %s.%s AND %s.%s = %s.%s)
WHERE (
(%s.%s != '%s')
AND (
((%s.%s %s '%s') OR (%s.%s %s '%s'))
OR
((%s.%s %s '%s') OR (%s.%s %s '%s'))
)
)
)
)
)
""".formatted(
cteCounter,
Expand All @@ -411,23 +427,26 @@ private String buildExactNegationAnyFieldQuery(String operator, String term) {
INNER_TABLE, ENTRY_ID,
mainTableName, INNER_TABLE,
splitValuesTableName, SPLIT_TABLE,
MAIN_TABLE, FIELD_NAME, SPLIT_TABLE, FIELD_NAME,
MAIN_TABLE, ENTRY_ID, SPLIT_TABLE, ENTRY_ID,
MAIN_TABLE, FIELD_VALUE_LITERAL, operator, term,
MAIN_TABLE, FIELD_VALUE_TRANSFORMED, operator, term,
INNER_TABLE, FIELD_NAME, SPLIT_TABLE, FIELD_NAME,
INNER_TABLE, ENTRY_ID, SPLIT_TABLE, ENTRY_ID,
INNER_TABLE, FIELD_NAME, GROUPS_FIELD, // https://github.com/JabRef/jabref/issues/7996
INNER_TABLE, FIELD_VALUE_LITERAL, operator, term,
INNER_TABLE, FIELD_VALUE_TRANSFORMED, operator, term,
SPLIT_TABLE, FIELD_VALUE_LITERAL, operator, term,
SPLIT_TABLE, FIELD_VALUE_TRANSFORMED, operator, term);
}

private String buildContainsNegationAnyFieldQuery(String operator, String prefixSuffix, String term) {
return """
cte%d AS (
SELECT %s.%s
FROM %s AS %s
WHERE %s.%s NOT IN (
SELECT %s.%s
FROM %s AS %s
WHERE ((%s.%s %s '%s%s%s') OR (%s.%s %s '%s%s%s'))
WHERE %s.%s NOT IN (
SELECT %s.%s
FROM %s AS %s
WHERE (
(%s.%s != '%s') AND ((%s.%s %s '%s%s%s') OR (%s.%s %s '%s%s%s'))
)
)
)
""".formatted(
Expand All @@ -437,6 +456,7 @@ private String buildContainsNegationAnyFieldQuery(String operator, String prefix
MAIN_TABLE, ENTRY_ID,
INNER_TABLE, ENTRY_ID,
mainTableName, INNER_TABLE,
INNER_TABLE, FIELD_NAME, GROUPS_FIELD, // https://github.com/JabRef/jabref/issues/7996
INNER_TABLE, FIELD_VALUE_LITERAL,
operator,
prefixSuffix, term, prefixSuffix,
Expand Down

0 comments on commit 9a35891

Please sign in to comment.