From 4158f37531da874d09dd854e49e8749de244f080 Mon Sep 17 00:00:00 2001 From: sxcz <11812714@mail.sustech.edu.cn> Date: Thu, 6 May 2021 21:42:53 +0800 Subject: [PATCH 1/4] fix issue 7395 --- CHANGELOG.md | 1 + .../gui/mergeentries/MergeEntriesAction.java | 19 ++++++++++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 97603ecfcc6..6ae9de5995e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -476,6 +476,7 @@ Note that this project **does not** adhere to [Semantic Versioning](http://semve - We added an option in preferences to allow for integers in field "edition" when running database in bibtex mode. [#4680](https://github.com/JabRef/jabref/issues/4680) - We added the ability to use negation in export filter layouts. [#5138](https://github.com/JabRef/jabref/pull/5138) - Focus on Name Area instead of 'OK' button whenever user presses 'Add subgroup'. [#6307](https://github.com/JabRef/jabref/issues/6307) +- We changed the behavior of merging that the entry which has "smaller" bibkey will be selected. [#7395](https://github.com/JabRef/jabref/issues/7395) ### Fixed diff --git a/src/main/java/org/jabref/gui/mergeentries/MergeEntriesAction.java b/src/main/java/org/jabref/gui/mergeentries/MergeEntriesAction.java index b4cf0cefa0f..2bde5f55817 100644 --- a/src/main/java/org/jabref/gui/mergeentries/MergeEntriesAction.java +++ b/src/main/java/org/jabref/gui/mergeentries/MergeEntriesAction.java @@ -52,7 +52,24 @@ public void execute() { BibEntry one = selectedEntries.get(0); BibEntry two = selectedEntries.get(1); - MergeEntriesDialog dlg = new MergeEntriesDialog(one, two); + // Compare the citation key + BibEntry first = one; + BibEntry second = two; + + Optional keyOne = one.getCitationKey(); + Optional keyTwo = two.getCitationKey(); + if (keyOne.isPresent() && keyTwo.isPresent() && keyOne.get().compareTo(keyTwo.get()) > 0) { + first = two; + second = one; + } + else { + if (keyTwo.isPresent()) { + first = two; + second = one; + } + } + + MergeEntriesDialog dlg = new MergeEntriesDialog(first, second); dlg.setTitle(Localization.lang("Merge entries")); Optional mergedEntry = dialogService.showCustomDialogAndWait(dlg); if (mergedEntry.isPresent()) { From 0b609fc2d1f1c3fe02f7dae595e97aa8f9f4bc2c Mon Sep 17 00:00:00 2001 From: sxcz <11812714@mail.sustech.edu.cn> Date: Fri, 7 May 2021 20:13:47 +0800 Subject: [PATCH 2/4] Use the EntryComparator --- .../gui/mergeentries/MergeEntriesAction.java | 23 ++++++++----------- .../comparator/EntryComparatorTest.java | 22 ++++++++++++++++++ 2 files changed, 32 insertions(+), 13 deletions(-) diff --git a/src/main/java/org/jabref/gui/mergeentries/MergeEntriesAction.java b/src/main/java/org/jabref/gui/mergeentries/MergeEntriesAction.java index 2bde5f55817..3a24e84246b 100644 --- a/src/main/java/org/jabref/gui/mergeentries/MergeEntriesAction.java +++ b/src/main/java/org/jabref/gui/mergeentries/MergeEntriesAction.java @@ -13,9 +13,11 @@ import org.jabref.gui.undo.NamedCompound; import org.jabref.gui.undo.UndoableInsertEntries; import org.jabref.gui.undo.UndoableRemoveEntries; +import org.jabref.logic.bibtex.comparator.EntryComparator; import org.jabref.logic.l10n.Localization; import org.jabref.model.database.BibDatabaseContext; import org.jabref.model.entry.BibEntry; +import org.jabref.model.entry.field.InternalField; public class MergeEntriesAction extends SimpleCommand { @@ -52,22 +54,17 @@ public void execute() { BibEntry one = selectedEntries.get(0); BibEntry two = selectedEntries.get(1); - // Compare the citation key - BibEntry first = one; - BibEntry second = two; - - Optional keyOne = one.getCitationKey(); - Optional keyTwo = two.getCitationKey(); - if (keyOne.isPresent() && keyTwo.isPresent() && keyOne.get().compareTo(keyTwo.get()) > 0) { + // compare two entries + BibEntry first; + BibEntry second; + EntryComparator entryComparator = new EntryComparator(false, false, InternalField.KEY_FIELD); + if (entryComparator.compare(one, two) <= 0) { + first = one; + second = two; + } else { first = two; second = one; } - else { - if (keyTwo.isPresent()) { - first = two; - second = one; - } - } MergeEntriesDialog dlg = new MergeEntriesDialog(first, second); dlg.setTitle(Localization.lang("Merge entries")); diff --git a/src/test/java/org/jabref/logic/bibtex/comparator/EntryComparatorTest.java b/src/test/java/org/jabref/logic/bibtex/comparator/EntryComparatorTest.java index 2b1ef343bbd..fa70932b342 100644 --- a/src/test/java/org/jabref/logic/bibtex/comparator/EntryComparatorTest.java +++ b/src/test/java/org/jabref/logic/bibtex/comparator/EntryComparatorTest.java @@ -1,6 +1,7 @@ package org.jabref.logic.bibtex.comparator; import org.jabref.model.entry.BibEntry; +import org.jabref.model.entry.field.InternalField; import org.jabref.model.entry.field.StandardField; import org.junit.jupiter.api.Test; @@ -14,4 +15,25 @@ void recognizeIdenticObjectsAsEqual() { BibEntry e2 = e1; assertEquals(0, new EntryComparator(false, false, StandardField.TITLE).compare(e1, e2)); } + + @Test + void compareObjectsByKeyAscending() { + BibEntry e1 = new BibEntry(); + BibEntry e2 = new BibEntry(); + e1.setCitationKey("Mayer2019b"); + e2.setCitationKey("Mayer2019a"); + assertEquals(1, new EntryComparator(false, false, InternalField.KEY_FIELD).compare(e1, e2)); + assertEquals(-1, new EntryComparator(false, false, InternalField.KEY_FIELD).compare(e2, e1)); + } + + @Test + void compareObjectsByKeyWithNull() { + BibEntry e1 = new BibEntry(); + BibEntry e2 = new BibEntry(); + e1.setCitationKey("Mayer2019b"); + assertEquals(-1, new EntryComparator(false, false, InternalField.KEY_FIELD).compare(e1, e2)); + assertEquals(1, new EntryComparator(false, false, InternalField.KEY_FIELD).compare(e2, e1)); + } } + + From 77a1ba190b9ab7aa7be3db6852874fe761ac4363 Mon Sep 17 00:00:00 2001 From: sxcz <11812714@mail.sustech.edu.cn> Date: Sat, 8 May 2021 12:41:49 +0800 Subject: [PATCH 3/4] use getCitationKey to get key in EntryComparator --- .../logic/bibtex/comparator/EntryComparator.java | 3 +++ .../logic/bibtex/comparator/EntryComparatorTest.java | 10 ++++++++++ 2 files changed, 13 insertions(+) diff --git a/src/main/java/org/jabref/logic/bibtex/comparator/EntryComparator.java b/src/main/java/org/jabref/logic/bibtex/comparator/EntryComparator.java index 2de02d07d6f..439563ed92a 100644 --- a/src/main/java/org/jabref/logic/bibtex/comparator/EntryComparator.java +++ b/src/main/java/org/jabref/logic/bibtex/comparator/EntryComparator.java @@ -72,6 +72,9 @@ public int compare(BibEntry e1, BibEntry e2) { // Sort by type. f1 = e1.getType(); f2 = e2.getType(); + } else if (sortField.equals(InternalField.KEY_FIELD)) { + f1 = e1.hasCitationKey() ? e1.getCitationKey().get() : null; + f2 = e2.hasCitationKey() ? e2.getCitationKey().get() : null; } else if (sortField.isNumeric()) { try { Integer i1 = Integer.parseInt((String) f1); diff --git a/src/test/java/org/jabref/logic/bibtex/comparator/EntryComparatorTest.java b/src/test/java/org/jabref/logic/bibtex/comparator/EntryComparatorTest.java index a7a04818e13..ae4a437c9c3 100644 --- a/src/test/java/org/jabref/logic/bibtex/comparator/EntryComparatorTest.java +++ b/src/test/java/org/jabref/logic/bibtex/comparator/EntryComparatorTest.java @@ -89,6 +89,16 @@ void compareObjectsByKeyWithNull() { assertEquals(-1, new EntryComparator(false, false, InternalField.KEY_FIELD).compare(e1, e2)); assertEquals(1, new EntryComparator(false, false, InternalField.KEY_FIELD).compare(e2, e1)); } + + @Test + void compareObjectsByKeyWithBlank() { + BibEntry e1 = new BibEntry(); + BibEntry e2 = new BibEntry(); + e1.setCitationKey("Mayer2019b"); + e2.setCitationKey(" "); + assertEquals(-1, new EntryComparator(false, false, InternalField.KEY_FIELD).compare(e1, e2)); + assertEquals(1, new EntryComparator(false, false, InternalField.KEY_FIELD).compare(e2, e1)); + } } From 699f8e2b51816f425f0e8559628f8fae062acbca Mon Sep 17 00:00:00 2001 From: sxcz <11812714@mail.sustech.edu.cn> Date: Mon, 10 May 2021 10:26:06 +0800 Subject: [PATCH 4/4] Use orElse with Optionals --- .../org/jabref/logic/bibtex/comparator/EntryComparator.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/jabref/logic/bibtex/comparator/EntryComparator.java b/src/main/java/org/jabref/logic/bibtex/comparator/EntryComparator.java index 439563ed92a..871a1516269 100644 --- a/src/main/java/org/jabref/logic/bibtex/comparator/EntryComparator.java +++ b/src/main/java/org/jabref/logic/bibtex/comparator/EntryComparator.java @@ -73,8 +73,8 @@ public int compare(BibEntry e1, BibEntry e2) { f1 = e1.getType(); f2 = e2.getType(); } else if (sortField.equals(InternalField.KEY_FIELD)) { - f1 = e1.hasCitationKey() ? e1.getCitationKey().get() : null; - f2 = e2.hasCitationKey() ? e2.getCitationKey().get() : null; + f1 = e1.getCitationKey().orElse(null); + f2 = e2.getCitationKey().orElse(null); } else if (sortField.isNumeric()) { try { Integer i1 = Integer.parseInt((String) f1);