5
5
import java .sql .SQLException ;
6
6
import java .util .Arrays ;
7
7
import java .util .Collection ;
8
+ import java .util .HashSet ;
8
9
import java .util .Map ;
9
10
import java .util .Optional ;
11
+ import java .util .Set ;
10
12
import java .util .regex .Pattern ;
11
13
12
14
import org .jabref .logic .l10n .Localization ;
@@ -47,7 +49,7 @@ public class BibFieldsIndexer {
47
49
private final String splitValuesTable ;
48
50
private final String schemaSplitValuesTableReference ;
49
51
private final Character keywordSeparator ;
50
- private final Field [] dateFields = new Field [] { StandardField .DATE , StandardField .YEAR , StandardField .MONTH , StandardField .DAY } ;
52
+ private final Set < Field > dateFields = new HashSet <>( Arrays . asList ( StandardField .DATE , StandardField .YEAR , StandardField .MONTH , StandardField .DAY )) ;
51
53
52
54
public BibFieldsIndexer (BibEntryPreferences bibEntryPreferences , BibDatabaseContext databaseContext , Connection connection ) {
53
55
this .databaseContext = databaseContext ;
@@ -217,7 +219,7 @@ private void addToIndex(BibEntry bibEntry) {
217
219
// To uncover these flaws, we add the "assert" statement.
218
220
// One potential future flaw is that the bibEntry is modified concurrently and the field being deleted.
219
221
// Skip indexing of date-related fields separately to ensure proper handling later in the process.
220
- if (field != StandardField . DATE && field != StandardField . YEAR && field != StandardField . MONTH && field != StandardField . DAY ) {
222
+ if (! dateFields . contains ( field ) ) {
221
223
Optional <String > resolvedFieldLatexFree = bibEntry .getResolvedFieldOrAliasLatexFree (field , this .databaseContext .getDatabase ());
222
224
assert resolvedFieldLatexFree .isPresent ();
223
225
addBatch (preparedStatement , entryId , field , value , resolvedFieldLatexFree .orElse ("" ));
@@ -245,8 +247,7 @@ private void addToIndex(BibEntry bibEntry) {
245
247
// ensure all date-related fields are indexed.
246
248
for (Field dateField : dateFields ) {
247
249
Optional <String > resolvedDateValue = bibEntry .getResolvedFieldOrAlias (dateField , this .databaseContext .getDatabase ());
248
- String dateValue = resolvedDateValue .orElse ("" );
249
- addBatch (preparedStatement , entryId , dateField , dateValue );
250
+ resolvedDateValue .ifPresent (dateValue -> addBatch (preparedStatement , entryId , dateField , dateValue ));
250
251
}
251
252
// add entry type
252
253
addBatch (preparedStatement , entryId , TYPE_HEADER , bibEntry .getType ().getName ());
@@ -309,6 +310,7 @@ private void insertField(BibEntry entry, Field field) {
309
310
FIELD_NAME ,
310
311
FIELD_VALUE_LITERAL ,
311
312
FIELD_VALUE_TRANSFORMED );
313
+ // Inserts a new record into the table, or updates the existing record if there's a conflict
312
314
String insertDateFieldQuery = """
313
315
INSERT INTO %s ("%s", "%s", "%s", "%s")
314
316
VALUES (?, ?, ?, ?)
@@ -325,12 +327,11 @@ ON CONFLICT ("%s", "%s")
325
327
FIELD_VALUE_TRANSFORMED , FIELD_VALUE_TRANSFORMED );
326
328
String entryId = entry .getId ();
327
329
// If the updated field is date-related, re-index all date fields to overwrite the previous value.
328
- if (field == StandardField . DATE || field == StandardField . YEAR || field == StandardField . MONTH || field == StandardField . DAY ) {
330
+ if (dateFields . contains ( field ) ) {
329
331
try (PreparedStatement preparedStatement = connection .prepareStatement (insertDateFieldQuery )) {
330
332
for (Field dateField : dateFields ) {
331
333
Optional <String > resolvedDateValue = entry .getResolvedFieldOrAlias (dateField , this .databaseContext .getDatabase ());
332
- String dateValue = resolvedDateValue .orElse ("" );
333
- addBatch (preparedStatement , entryId , dateField , dateValue );
334
+ resolvedDateValue .ifPresent (dateValue -> addBatch (preparedStatement , entryId , dateField , dateValue ));
334
335
}
335
336
preparedStatement .executeBatch ();
336
337
} catch (SQLException e ) {
@@ -348,6 +349,7 @@ ON CONFLICT ("%s", "%s")
348
349
LOGGER .error ("Could not add an entry to the index." , e );
349
350
}
350
351
}
352
+
351
353
String insertIntoSplitTable = """
352
354
INSERT INTO %s ("%s", "%s", "%s", "%s")
353
355
VALUES (?, ?, ?, ?)
0 commit comments