Skip to content

Commit f52fcb4

Browse files
ArshKumar84koppor
andauthored
Improve merge logic to prefer valid year and entry type (#13506)
* feat: improve merge dialog to prefer better entry type and year (fixes #12549) - Added YearFieldValueValidityComparator to prefer DOI year when local year is unrealistic or differs by more than 10 years - Enhanced entry type comparison logic to select DOI entry type if local is "misc" - Applied auto-selection in Merge Entries dialog when merging using DOI fetcher * Update CHANGELOG.md Enhanced field selection logic in the Merge Entries dialog when fetching from DOI to prefer valid years and entry types * Update CHANGELOG.md * feat: improve merge dialog to prefer better entry type and year (fixes #12549) - applied enum for comparison result to improve the readability - Refactored FieldValueValidityComparator to abstract FieldValuePlausibilityComparator - Enabled plausibility comparison across all fetcher types * feat: Improved readability and removed unnecessary method call - Removed unnecessary method call from ComparisonResult in YearFieldValuePlausibilityComparator - Removed unnecessary code in enum ComparisonResult - Added comment for extractYear() in YearFieldValuePlausibilityComparator * Apply suggestion from @koppor Co-authored-by: Oliver Kopp <kopp.dev@gmail.com> * Apply suggestion from @koppor Co-authored-by: Oliver Kopp <kopp.dev@gmail.com> --------- Co-authored-by: Oliver Kopp <kopp.dev@gmail.com>
1 parent ea49a3e commit f52fcb4

File tree

11 files changed

+139
-0
lines changed

11 files changed

+139
-0
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ Note that this project **does not** adhere to [Semantic Versioning](https://semv
7474
- We fixed an issue where Document Viewer showed technical exceptions when opening entries with non-PDF files. [#13198](https://github.com/JabRef/jabref/issues/13198)
7575
- When creating a library, if you drag a PDF file containing only a single column, the dialog will now automatically close. [#13262](https://github.com/JabRef/jabref/issues/13262)
7676
- We fixed an issue where the tab showing the fulltext search results would appear blank after switching library. [#13241](https://github.com/JabRef/jabref/issues/13241)
77+
- Enhanced field selection logic in the Merge Entries dialog when fetching from DOI to prefer valid years and entry types. [#12549](https://github.com/JabRef/jabref/issues/12549)
7778

7879
### Removed
7980

jabgui/src/main/java/org/jabref/gui/mergeentries/FetchAndMergeEntry.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ private void showMergeDialog(BibEntry originalEntry, BibEntry fetchedEntry, WebF
107107
dialog.setTitle(Localization.lang("Merge entry with %0 information", fetcher.getName()));
108108
dialog.setLeftHeaderText(Localization.lang("Original entry"));
109109
dialog.setRightHeaderText(Localization.lang("Entry from %0", fetcher.getName()));
110+
dialog.autoSelectBetterFields();
110111
Optional<BibEntry> mergedEntry = dialogService.showCustomDialogAndWait(dialog).map(EntriesMergeResult::mergedEntry);
111112

112113
if (mergedEntry.isPresent()) {

jabgui/src/main/java/org/jabref/gui/mergeentries/MergeEntriesDialog.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,4 +64,8 @@ public void setRightHeaderText(String rightHeaderText) {
6464
public void configureDiff(ShowDiffConfig diffConfig) {
6565
threeWayMergeView.showDiff(diffConfig);
6666
}
67+
68+
public void autoSelectBetterFields() {
69+
threeWayMergeView.autoSelectBetterFields();
70+
}
6771
}

jabgui/src/main/java/org/jabref/gui/mergeentries/newmergedialog/FieldRowView.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,10 @@ public boolean hasEqualLeftAndRightValues() {
208208
return viewModel.hasEqualLeftAndRightValues();
209209
}
210210

211+
public void autoSelectBetterValue() {
212+
viewModel.autoSelectBetterValue();
213+
}
214+
211215
@Override
212216
public String toString() {
213217
return "FieldRowView [shouldShowDiffs=" + shouldShowDiffs.get() + ", fieldNameCell=" + fieldNameCell + ", leftValueCell=" + leftValueCell + ", rightValueCell=" + rightValueCell + ", mergedValueCell=" + mergedValueCell + "]";

jabgui/src/main/java/org/jabref/gui/mergeentries/newmergedialog/FieldRowViewModel.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,14 @@
1616

1717
import org.jabref.gui.mergeentries.newmergedialog.fieldsmerger.FieldMerger;
1818
import org.jabref.gui.mergeentries.newmergedialog.fieldsmerger.FieldMergerFactory;
19+
import org.jabref.logic.bibtex.comparator.ComparisonResult;
20+
import org.jabref.logic.bibtex.comparator.YearFieldValuePlausibilityComparator;
1921
import org.jabref.model.entry.BibEntry;
2022
import org.jabref.model.entry.field.Field;
2123
import org.jabref.model.entry.field.InternalField;
24+
import org.jabref.model.entry.field.StandardField;
2225
import org.jabref.model.entry.types.EntryTypeFactory;
26+
import org.jabref.model.entry.types.StandardEntryType;
2327
import org.jabref.model.strings.StringUtil;
2428

2529
import com.tobiasdiez.easybind.EasyBind;
@@ -120,6 +124,25 @@ public FieldRowViewModel(Field field, BibEntry leftEntry, BibEntry rightEntry, B
120124
EasyBind.subscribe(hasEqualLeftAndRightBinding(), this::setIsFieldsMerged);
121125
}
122126

127+
public void autoSelectBetterValue() {
128+
String leftValue = getLeftFieldValue();
129+
String rightValue = getRightFieldValue();
130+
131+
if (StandardField.YEAR == field) {
132+
YearFieldValuePlausibilityComparator comparator = new YearFieldValuePlausibilityComparator();
133+
ComparisonResult comparison = comparator.compare(leftValue, rightValue);
134+
if (ComparisonResult.RIGHT_BETTER == comparison) {
135+
selectRightValue();
136+
} else if (ComparisonResult.LEFT_BETTER == comparison) {
137+
selectLeftValue();
138+
}
139+
} else if (InternalField.TYPE_HEADER == field) {
140+
if (leftValue.equalsIgnoreCase(StandardEntryType.Misc.getName())) {
141+
selectRightValue();
142+
}
143+
}
144+
}
145+
123146
public void selectNonEmptyValue() {
124147
if (StringUtil.isNullOrEmpty(leftFieldValue.get())) {
125148
selectRightValue();

jabgui/src/main/java/org/jabref/gui/mergeentries/newmergedialog/ThreeWayMergeView.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,4 +200,10 @@ public BibEntry getRightEntry() {
200200
public void saveConfiguration() {
201201
toolbar.saveToolbarConfiguration();
202202
}
203+
204+
public void autoSelectBetterFields() {
205+
for (FieldRowView row : fieldRows) {
206+
row.autoSelectBetterValue();
207+
}
208+
}
203209
}

jabgui/src/test/java/org/jabref/gui/mergeentries/FieldRowViewModelTest.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,24 @@ void unmergeFieldsShouldDoNothingIfFieldsAreNotMerged() {
214214
assertEquals(oldRightGroups, groupsField.getRightFieldValue());
215215
}
216216

217+
@Test
218+
void newYearShouldBeSelectedForYearsWithLargeValueGap() {
219+
BibEntry leftEntry = new BibEntry().withField(StandardField.YEAR, "1990");
220+
BibEntry rightEntry = new BibEntry().withField(StandardField.YEAR, "2020");
221+
FieldRowViewModel yearField = new FieldRowViewModel(StandardField.YEAR, leftEntry, rightEntry, mergedEntry, fieldMergerFactory);
222+
yearField.autoSelectBetterValue();
223+
assertEquals(FieldRowViewModel.Selection.RIGHT, yearField.getSelection());
224+
}
225+
226+
@Test
227+
void yearInRangeShouldBeSelected() {
228+
BibEntry leftEntry = new BibEntry().withField(StandardField.YEAR, "1700");
229+
BibEntry rightEntry = new BibEntry().withField(StandardField.YEAR, "2000");
230+
FieldRowViewModel yearField = new FieldRowViewModel(StandardField.YEAR, leftEntry, rightEntry, mergedEntry, fieldMergerFactory);
231+
yearField.autoSelectBetterValue();
232+
assertEquals(FieldRowViewModel.Selection.RIGHT, yearField.getSelection());
233+
}
234+
217235
public FieldRowViewModel createViewModelForField(Field field) {
218236
return new FieldRowViewModel(field, leftEntry, rightEntry, mergedEntry, fieldMergerFactory);
219237
}

jablib/src/main/java/module-info.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,5 +249,6 @@
249249
requires mslinks;
250250
requires org.antlr.antlr4.runtime;
251251
requires org.libreoffice.uno;
252+
requires org.jetbrains.annotations;
252253
// endregion
253254
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package org.jabref.logic.bibtex.comparator;
2+
3+
public enum ComparisonResult {
4+
LEFT_BETTER,
5+
RIGHT_BETTER,
6+
UNDETERMINED
7+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package org.jabref.logic.bibtex.comparator;
2+
3+
public abstract class FieldValuePlausibilityComparator {
4+
/**
5+
* Compares the plausibility of two field values.
6+
*
7+
* @param leftValue value from the library (or candidate)
8+
* @param rightValue value from the fetcher (or existing record)
9+
* @return ComparisonResult indicating which field is more plausible: RIGHT_BETTER, LEFT_BETTER, or UNDETERMINED
10+
*/
11+
public abstract ComparisonResult compare(String leftValue, String rightValue);
12+
}

0 commit comments

Comments
 (0)