-
-
Notifications
You must be signed in to change notification settings - Fork 2.5k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
9 changed files
with
202 additions
and
224 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
110 changes: 0 additions & 110 deletions
110
src/main/java/org/jabref/model/search/rules/ContainBasedSearchRule.java
This file was deleted.
Oops, something went wrong.
59 changes: 59 additions & 0 deletions
59
src/main/java/org/jabref/model/search/rules/ContainsBasedSearchRule.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,59 @@ | ||
package org.jabref.model.search.rules; | ||
|
||
import java.util.EnumSet; | ||
import java.util.Iterator; | ||
import java.util.List; | ||
import java.util.Locale; | ||
|
||
import org.jabref.architecture.AllowedToUseLogic; | ||
import org.jabref.model.entry.BibEntry; | ||
import org.jabref.model.entry.field.Field; | ||
import org.jabref.model.search.rules.SearchRules.SearchFlags; | ||
|
||
/** | ||
* Search rule for a search based on String.contains() | ||
*/ | ||
@AllowedToUseLogic("Because access to the lucene index is needed") | ||
public class ContainsBasedSearchRule extends FullTextSearchRule { | ||
|
||
public ContainsBasedSearchRule(EnumSet<SearchFlags> searchFlags) { | ||
super(searchFlags); | ||
} | ||
|
||
@Override | ||
public boolean validateSearchStrings(String query) { | ||
return true; | ||
} | ||
|
||
@Override | ||
public boolean applyRule(String query, BibEntry bibEntry) { | ||
String searchString = query; | ||
if (!searchFlags.contains(SearchRules.SearchFlags.CASE_SENSITIVE)) { | ||
searchString = searchString.toLowerCase(Locale.ROOT); | ||
} | ||
|
||
List<String> unmatchedWords = new SentenceAnalyzer(searchString).getWords(); | ||
|
||
for (Field fieldKey : bibEntry.getFields()) { | ||
String formattedFieldContent = bibEntry.getLatexFreeField(fieldKey).get(); | ||
if (!searchFlags.contains(SearchRules.SearchFlags.CASE_SENSITIVE)) { | ||
formattedFieldContent = formattedFieldContent.toLowerCase(Locale.ROOT); | ||
} | ||
|
||
Iterator<String> unmatchedWordsIterator = unmatchedWords.iterator(); | ||
while (unmatchedWordsIterator.hasNext()) { | ||
String word = unmatchedWordsIterator.next(); | ||
if (formattedFieldContent.contains(word)) { | ||
unmatchedWordsIterator.remove(); | ||
} | ||
} | ||
|
||
if (unmatchedWords.isEmpty()) { | ||
return true; | ||
} | ||
} | ||
|
||
return getFulltextResults(query, bibEntry).numSearchResults() > 0; // Didn't match all words. | ||
} | ||
|
||
} |
71 changes: 71 additions & 0 deletions
71
src/main/java/org/jabref/model/search/rules/FullTextSearchRule.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,71 @@ | ||
package org.jabref.model.search.rules; | ||
|
||
import java.io.IOException; | ||
import java.util.Collections; | ||
import java.util.EnumSet; | ||
import java.util.List; | ||
import java.util.stream.Collectors; | ||
|
||
import org.jabref.architecture.AllowedToUseLogic; | ||
import org.jabref.gui.Globals; | ||
import org.jabref.logic.pdf.search.retrieval.PdfSearcher; | ||
import org.jabref.model.database.BibDatabaseContext; | ||
import org.jabref.model.entry.BibEntry; | ||
import org.jabref.model.pdf.search.PdfSearchResults; | ||
import org.jabref.model.pdf.search.SearchResult; | ||
|
||
import org.slf4j.Logger; | ||
import org.slf4j.LoggerFactory; | ||
|
||
/** | ||
* All classes providing full text search results inherit from this class. | ||
* <p> | ||
* Some kind of caching of the full text search results is implemented. | ||
*/ | ||
@AllowedToUseLogic("Because access to the lucene index is needed") | ||
public abstract class FullTextSearchRule implements SearchRule { | ||
|
||
private static final Logger LOGGER = LoggerFactory.getLogger(FullTextSearchRule.class); | ||
|
||
protected final EnumSet<SearchRules.SearchFlags> searchFlags; | ||
|
||
protected String lastQuery; | ||
protected List<SearchResult> lastSearchResults; | ||
|
||
private final BibDatabaseContext databaseContext; | ||
|
||
public FullTextSearchRule(EnumSet<SearchRules.SearchFlags> searchFlags) { | ||
this.searchFlags = searchFlags; | ||
this.lastQuery = ""; | ||
lastSearchResults = Collections.emptyList(); | ||
|
||
databaseContext = Globals.stateManager.getActiveDatabase().orElse(null); | ||
} | ||
|
||
public EnumSet<SearchRules.SearchFlags> getSearchFlags() { | ||
return searchFlags; | ||
} | ||
|
||
@Override | ||
public PdfSearchResults getFulltextResults(String query, BibEntry bibEntry) { | ||
if (!searchFlags.contains(SearchRules.SearchFlags.FULLTEXT) || databaseContext == null) { | ||
return new PdfSearchResults(); | ||
} | ||
|
||
if (!query.equals(this.lastQuery)) { | ||
this.lastQuery = query; | ||
lastSearchResults = Collections.emptyList(); | ||
try { | ||
PdfSearcher searcher = PdfSearcher.of(databaseContext); | ||
PdfSearchResults results = searcher.search(query, 5); | ||
lastSearchResults = results.getSortedByScore(); | ||
} catch (IOException e) { | ||
LOGGER.error("Could not retrieve search results!", e); | ||
} | ||
} | ||
|
||
return new PdfSearchResults(lastSearchResults.stream() | ||
.filter(searchResult -> searchResult.isResultFor(bibEntry)) | ||
.collect(Collectors.toList())); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.