Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Remove cache of auto completion results #6310

Merged
merged 1 commit into from
Apr 19, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 3 additions & 39 deletions src/main/java/org/jabref/gui/BasePanel.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,7 @@
import javafx.scene.layout.StackPane;

import org.jabref.Globals;
import org.jabref.JabRefExecutorService;
import org.jabref.gui.autocompleter.AutoCompletePreferences;
import org.jabref.gui.autocompleter.AutoCompleteUpdater;
import org.jabref.gui.autocompleter.PersonNameSuggestionProvider;
import org.jabref.gui.autocompleter.SuggestionProviders;
import org.jabref.gui.collab.DatabaseChangeMonitor;
Expand All @@ -42,7 +40,6 @@
import org.jabref.model.database.BibDatabaseContext;
import org.jabref.model.database.KeyCollisionException;
import org.jabref.model.database.event.BibDatabaseContextChangedEvent;
import org.jabref.model.database.event.CoarseChangeFilter;
import org.jabref.model.database.event.EntriesAddedEvent;
import org.jabref.model.database.event.EntriesRemovedEvent;
import org.jabref.model.database.shared.DatabaseLocation;
Expand Down Expand Up @@ -93,12 +90,10 @@ public class BasePanel extends StackPane {
// the query the user searches when this BasePanel is active
private Optional<SearchQuery> currentSearchQuery = Optional.empty();
private Optional<DatabaseChangeMonitor> changeMonitor = Optional.empty();
private JabRefExecutorService executorService;

public BasePanel(JabRefFrame frame, BasePanelPreferences preferences, BibDatabaseContext bibDatabaseContext, ExternalFileTypes externalFileTypes) {
this.preferences = Objects.requireNonNull(preferences);
this.frame = Objects.requireNonNull(frame);
this.executorService = JabRefExecutorService.INSTANCE;
this.bibDatabaseContext = Objects.requireNonNull(bibDatabaseContext);
this.externalFileTypes = Objects.requireNonNull(externalFileTypes);
this.undoManager = frame.getUndoManager();
Expand All @@ -114,6 +109,7 @@ public BasePanel(JabRefFrame frame, BasePanelPreferences preferences, BibDatabas
annotationCache = new FileAnnotationCache(bibDatabaseContext, Globals.prefs.getFilePreferences());

setupMainPanel();
setupAutoCompletion();

this.getDatabase().registerListener(new SearchListener());
this.getDatabase().registerListener(new EntriesRemovedListener());
Expand Down Expand Up @@ -379,11 +375,6 @@ public void setupMainPanel() {

splitPane.getItems().add(mainTable);

// Set up name autocompleter for search:
setupAutoCompletion();
executorService.execute(this::instantiateSearchAutoCompleter);
this.getDatabase().registerListener(new SearchAutoCompleteListener());

// Saves the divider position as soon as it changes
// We need to keep a reference to the subscription, otherwise the binding gets garbage collected
dividerPositionSubscription = EasyBind.monadic(Bindings.valueAt(splitPane.getDividers(), 0))
Expand Down Expand Up @@ -413,28 +404,18 @@ public void setupMainPanel() {
private void setupAutoCompletion() {
AutoCompletePreferences autoCompletePreferences = preferences.getAutoCompletePreferences();
if (autoCompletePreferences.shouldAutoComplete()) {
suggestionProviders = new SuggestionProviders(autoCompletePreferences, Globals.journalAbbreviationLoader);
suggestionProviders.indexDatabase(getDatabase());
// Ensure that the suggestion providers are in sync with entries
CoarseChangeFilter changeFilter = new CoarseChangeFilter(bibDatabaseContext);
changeFilter.registerListener(new AutoCompleteUpdater(suggestionProviders));
suggestionProviders = new SuggestionProviders(getDatabase(), autoCompletePreferences, Globals.journalAbbreviationLoader);
} else {
// Create empty suggestion providers if auto completion is deactivated
suggestionProviders = new SuggestionProviders();
}
searchAutoCompleter = new PersonNameSuggestionProvider(FieldFactory.getPersonNameFields(), getDatabase());
}

public void updateSearchManager() {
frame.getGlobalSearchBar().setAutoCompleter(searchAutoCompleter);
}

private void instantiateSearchAutoCompleter() {
searchAutoCompleter = new PersonNameSuggestionProvider(FieldFactory.getPersonNameFields());
for (BibEntry entry : bibDatabaseContext.getDatabase().getEntries()) {
searchAutoCompleter.indexEntry(entry);
}
}

private void adjustSplitter() {
if (mode == BasePanelMode.SHOWING_EDITOR) {
splitPane.setDividerPositions(preferences.getEntryEditorDividerPosition());
Expand Down Expand Up @@ -730,23 +711,6 @@ public void listen(EntriesRemovedEvent entriesRemovedEvent) {
}
}

/**
* Ensures that the search auto completer is up to date when entries are changed AKA Let the auto completer, if any,
* harvest words from the entry Actual methods for autocomplete indexing must run in javafx thread
*/
private class SearchAutoCompleteListener {

@Subscribe
public void listen(EntriesAddedEvent addedEntriesEvent) {
DefaultTaskExecutor.runInJavaFXThread(() -> addedEntriesEvent.getBibEntries().forEach(entry -> searchAutoCompleter.indexEntry(entry)));
}

@Subscribe
public void listen(EntryChangedEvent entryChangedEvent) {
DefaultTaskExecutor.runInJavaFXThread(() -> searchAutoCompleter.indexEntry(entryChangedEvent.getBibEntry()));
}
}

/**
* Ensures that the results of the current search are updated when a new entry is inserted into the database Actual
* methods for performing search must run in javafx thread
Expand Down

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,25 +1,31 @@
package org.jabref.gui.autocompleter;

import java.util.Comparator;
import java.util.stream.Stream;

import org.jabref.logic.bibtex.comparator.EntryComparator;
import org.jabref.model.database.BibDatabase;
import org.jabref.model.entry.BibEntry;
import org.jabref.model.entry.field.InternalField;
import org.jabref.model.strings.StringUtil;

import com.google.common.base.Equivalence;
import org.controlsfx.control.textfield.AutoCompletionBinding;

/**
* Delivers possible completions as a list of {@link BibEntry} based on their cite key.
*/
public class BibEntrySuggestionProvider extends SuggestionProvider<BibEntry> implements AutoCompleteSuggestionProvider<BibEntry> {
public class BibEntrySuggestionProvider extends SuggestionProvider<BibEntry> {

@Override
public void indexEntry(BibEntry entry) {
if (entry == null) {
return;
}
private final BibDatabase database;

public BibEntrySuggestionProvider(BibDatabase database) {
this.database = database;
}

addPossibleSuggestions(entry);
@Override
protected Equivalence<BibEntry> getEquivalence() {
return Equivalence.equals().onResultOf(BibEntry::getCiteKeyOptional);
}

@Override
Expand All @@ -28,10 +34,15 @@ protected Comparator<BibEntry> getComparator() {
}

@Override
protected boolean isMatch(BibEntry suggestion, AutoCompletionBinding.ISuggestionRequest request) {
String userTextLower = request.getUserText().toLowerCase();
return suggestion.getCiteKeyOptional()
.map(key -> key.toLowerCase().contains(userTextLower))
.orElse(false);
protected boolean isMatch(BibEntry entry, AutoCompletionBinding.ISuggestionRequest request) {
String userText = request.getUserText();
return entry.getCiteKeyOptional()
.map(key -> StringUtil.containsIgnoreCase(key, userText))
.orElse(false);
}

@Override
public Stream<BibEntry> getSource() {
return database.getEntries().parallelStream();
}
}
Original file line number Diff line number Diff line change
@@ -1,40 +1,25 @@
package org.jabref.gui.autocompleter;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import org.jabref.model.entry.BibEntry;

import org.controlsfx.control.textfield.AutoCompletionBinding;
import java.util.stream.Stream;

/**
* Enriches a suggestion provider by a given set of content selector values.
*/
public class ContentSelectorSuggestionProvider implements AutoCompleteSuggestionProvider<String> {
public class ContentSelectorSuggestionProvider extends StringSuggestionProvider {

private final AutoCompleteSuggestionProvider<String> suggestionProvider;
private final SuggestionProvider<String> suggestionProvider;
private final List<String> contentSelectorValues;

public ContentSelectorSuggestionProvider(AutoCompleteSuggestionProvider<String> suggestionProvider,
public ContentSelectorSuggestionProvider(SuggestionProvider<String> suggestionProvider,
List<String> contentSelectorValues) {

this.suggestionProvider = suggestionProvider;
this.contentSelectorValues = contentSelectorValues;
}

@Override
public Collection<String> call(AutoCompletionBinding.ISuggestionRequest request) {
List<String> suggestions = new ArrayList<>();
if (suggestionProvider != null) {
suggestions.addAll(suggestionProvider.call(request));
}
suggestions.addAll(contentSelectorValues);
return suggestions;
}

@Override
public void indexEntry(BibEntry entry) {
suggestionProvider.indexEntry(entry);
public Stream<String> getSource() {
return Stream.concat(contentSelectorValues.stream(), suggestionProvider.getSource());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package org.jabref.gui.autocompleter;

import java.util.Comparator;
import java.util.stream.Stream;

import com.google.common.base.Equivalence;
import org.controlsfx.control.textfield.AutoCompletionBinding;

public class EmptySuggestionProvider extends SuggestionProvider<String> {
@Override
protected Equivalence<String> getEquivalence() {
return Equivalence.equals().onResultOf(value -> value);
}

@Override
protected Comparator<String> getComparator() {
return Comparator.naturalOrder();
}

@Override
protected boolean isMatch(String candidate, AutoCompletionBinding.ISuggestionRequest request) {
return false;
}

@Override
public Stream<String> getSource() {
return Stream.empty();
}
}
Original file line number Diff line number Diff line change
@@ -1,27 +1,26 @@
package org.jabref.gui.autocompleter;

import java.util.Objects;
import java.util.stream.Stream;

import org.jabref.model.entry.BibEntry;
import org.jabref.model.database.BibDatabase;
import org.jabref.model.entry.field.Field;

/**
* Stores the full content of one field.
*/
class FieldValueSuggestionProvider extends StringSuggestionProvider implements AutoCompleteSuggestionProvider<String> {
class FieldValueSuggestionProvider extends StringSuggestionProvider {

private final Field field;
private final BibDatabase database;

FieldValueSuggestionProvider(Field field) {
FieldValueSuggestionProvider(Field field, BibDatabase database) {
this.field = Objects.requireNonNull(field);
this.database = database;
}

@Override
public void indexEntry(BibEntry entry) {
if (entry == null) {
return;
}

entry.getField(field).ifPresent(fieldValue -> addPossibleSuggestions(fieldValue.trim()));
public Stream<String> getSource() {
return database.getEntries().parallelStream().flatMap(entry -> entry.getField(field).stream());
}
}
Original file line number Diff line number Diff line change
@@ -1,24 +1,24 @@
package org.jabref.gui.autocompleter;

import java.util.List;
import java.util.stream.Collectors;

import org.jabref.logic.journals.Abbreviation;
import org.jabref.logic.journals.JournalAbbreviationLoader;
import org.jabref.logic.journals.JournalAbbreviationPreferences;
import org.jabref.model.database.BibDatabase;
import org.jabref.model.entry.field.Field;

public class JournalsSuggestionProvider extends FieldValueSuggestionProvider {

JournalsSuggestionProvider(Field field, AutoCompletePreferences preferences,
JournalsSuggestionProvider(Field field, BibDatabase database, AutoCompletePreferences preferences,
JournalAbbreviationLoader abbreviationLoader) {
super(field);
super(field, database);

/*
TODO: Reenable

JournalAbbreviationPreferences journalAbbreviationPreferences = preferences.getJournalAbbreviationPreferences();
List<String> journals = abbreviationLoader.getRepository(journalAbbreviationPreferences)
.getAbbreviations().stream()
.map(Abbreviation::getName)
.collect(Collectors.toList());
addPossibleSuggestions(journals);
*/
}
}
Loading