use of org.jbei.ice.lib.shared.BioSafetyOption in project ice by JBEI.
the class HibernateSearch method executeSearch.
@SuppressWarnings("unchecked")
public SearchResults executeSearch(String userId, HashMap<String, QueryType> terms, SearchQuery searchQuery, HashMap<String, SearchResult> blastResults) {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
int resultCount;
FullTextSession fullTextSession = Search.getFullTextSession(session);
BooleanQuery.Builder builder = new BooleanQuery.Builder();
// get classes for search
HashSet<String> fields = new HashSet<>(SearchFieldFactory.entryFields(searchQuery.getEntryTypes()));
Class<?>[] classes = SearchFieldFactory.classesForTypes(searchQuery.getEntryTypes());
// generate queries for terms filtering stop words
for (Map.Entry<String, QueryType> entry : terms.entrySet()) {
String term = cleanQuery(entry.getKey());
if (term.trim().isEmpty() || StandardAnalyzer.STOP_WORDS_SET.contains(term.toLowerCase()))
continue;
BioSafetyOption safetyOption = searchQuery.getBioSafetyOption();
generateQueriesForType(fullTextSession, fields, builder, term, entry.getValue(), safetyOption);
}
// check for blast search results filter
createBlastFilterQuery(fullTextSession, blastResults, builder);
// wrap Lucene query in a org.hibernate.Query
FullTextQuery fullTextQuery = fullTextSession.createFullTextQuery(builder.build(), classes);
// get max score
fullTextQuery.setFirstResult(0);
fullTextQuery.setMaxResults(1);
fullTextQuery.setProjection(FullTextQuery.SCORE);
List<?> result = fullTextQuery.list();
float maxScore = -1f;
if (result.size() == 1) {
maxScore = (Float) ((Object[]) (result.get(0)))[0];
}
// end get max score
// get sorting values
Sort sort = getSort(searchQuery.getParameters().isSortAscending(), searchQuery.getParameters().getSortField());
fullTextQuery.setSort(sort);
// projection (specified properties must be stored in the index @Field(store=Store.YES))
fullTextQuery.setProjection(FullTextQuery.SCORE, FullTextQuery.ID, "owner");
// enable security filter if needed
checkEnableSecurityFilter(userId.toLowerCase(), fullTextQuery);
// check sample
checkEnableHasAttribute(fullTextQuery, searchQuery.getParameters());
// set paging params
fullTextQuery.setFirstResult(searchQuery.getParameters().getStart());
fullTextQuery.setMaxResults(searchQuery.getParameters().getRetrieveCount());
resultCount = fullTextQuery.getResultSize();
// execute search
result = fullTextQuery.list();
Logger.info(userId + ": " + resultCount + " results for \"" + searchQuery.getQueryString() + "\"");
LinkedList<SearchResult> searchResults = new LinkedList<>();
for (Object[] objects : (Iterable<Object[]>) result) {
float score = (Float) objects[0];
Long entryId = (Long) objects[1];
SearchResult searchResult;
if (blastResults != null) {
searchResult = blastResults.get(Long.toString(entryId));
if (// this should not really happen since we already filter
searchResult == null)
continue;
} else {
searchResult = new SearchResult();
searchResult.setScore(score);
PartData info = ModelToInfoFactory.createTableView(entryId, null);
info.setOwner((String) objects[2]);
searchResult.setEntryInfo(info);
}
searchResult.setMaxScore(maxScore);
searchResults.add(searchResult);
}
SearchResults results = new SearchResults();
results.setResultCount(resultCount);
results.setResults(searchResults);
return results;
}
use of org.jbei.ice.lib.shared.BioSafetyOption in project ice by JBEI.
the class HibernateSearch method executeSearchNoTerms.
public SearchResults executeSearchNoTerms(String userId, HashMap<String, SearchResult> blastResults, SearchQuery searchQuery) {
ArrayList<EntryType> entryTypes = searchQuery.getEntryTypes();
if (entryTypes == null || entryTypes.isEmpty()) {
entryTypes = new ArrayList<>(Arrays.asList(EntryType.values()));
}
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
int resultCount;
FullTextSession fullTextSession = Search.getFullTextSession(session);
BooleanQuery.Builder builder = new BooleanQuery.Builder();
QueryBuilder qb = fullTextSession.getSearchFactory().buildQueryBuilder().forEntity(Entry.class).get();
ArrayList<Query> except = new ArrayList<>();
for (EntryType type : EntryType.values()) {
if (entryTypes.contains(type))
continue;
except.add(qb.keyword().onField("recordType").matching(type.getName()).createQuery());
}
// add terms for record types
Query[] queries = new Query[] {};
Query recordTypeQuery = qb.all().except(except.toArray(queries)).createQuery();
builder.add(recordTypeQuery, BooleanClause.Occur.FILTER);
// visibility
Query visibilityQuery = qb.keyword().onField("visibility").matching(Visibility.OK.getValue()).createQuery();
builder.add(visibilityQuery, BooleanClause.Occur.FILTER);
// bio safety level
BioSafetyOption option = searchQuery.getBioSafetyOption();
if (option != null) {
TermContext bslContext = qb.keyword();
Query biosafetyQuery = bslContext.onField("bioSafetyLevel").ignoreFieldBridge().matching(option.getIntValue()).createQuery();
builder.add(biosafetyQuery, BooleanClause.Occur.FILTER);
}
// check filter filters
if (searchQuery.getFieldFilters() != null && !searchQuery.getFieldFilters().isEmpty()) {
for (FieldFilter fieldFilter : searchQuery.getFieldFilters()) {
String searchField = SearchFieldFactory.searchFieldForEntryField(fieldFilter.getField());
if (StringUtils.isEmpty(searchField))
continue;
Query filterQuery = qb.keyword().onField(searchField).matching(fieldFilter.getFilter()).createQuery();
builder.add(filterQuery, BooleanClause.Occur.MUST);
}
}
// check if there is a blast results
createBlastFilterQuery(fullTextSession, blastResults, builder);
// wrap Lucene query in a org.hibernate.Query
FullTextQuery fullTextQuery = fullTextSession.createFullTextQuery(builder.build(), Entry.class);
// get sorting values
Sort sort = getSort(searchQuery.getParameters().isSortAscending(), searchQuery.getParameters().getSortField());
fullTextQuery.setSort(sort);
fullTextQuery.setProjection(ProjectionConstants.ID, "owner");
// enable security filter if needed
checkEnableSecurityFilter(userId, fullTextQuery);
// enable has attachment/sequence/sample (if needed)
checkEnableHasAttribute(fullTextQuery, searchQuery.getParameters());
// set paging params
fullTextQuery.setFirstResult(searchQuery.getParameters().getStart());
fullTextQuery.setMaxResults(searchQuery.getParameters().getRetrieveCount());
resultCount = fullTextQuery.getResultSize();
List<?> result = fullTextQuery.list();
LinkedList<SearchResult> searchResults = new LinkedList<>();
// since we are using projection, result is an arraylist of objects
for (Object object : result) {
Object[] objects = (Object[]) object;
long entryId = (Long) objects[0];
SearchResult searchResult;
if (blastResults != null) {
searchResult = blastResults.get(Long.toString(entryId));
if (// this should not really happen since we already filter
searchResult == null)
continue;
} else {
searchResult = new SearchResult();
searchResult.setScore(1f);
PartData info = ModelToInfoFactory.createTableView(entryId, null);
info.setOwner((String) objects[1]);
searchResult.setEntryInfo(info);
}
searchResult.setMaxScore(1f);
searchResults.add(searchResult);
}
SearchResults results = new SearchResults();
results.setResultCount(resultCount);
results.setResults(searchResults);
Logger.info(userId + ": obtained " + resultCount + " results for empty query");
return results;
}
Aggregations