use of org.alfresco.repo.search.impl.querymodel.Query in project alfresco-repository by Alfresco.
the class CMISQueryServiceImpl method query.
public CMISResultSet query(CMISQueryOptions options) {
Pair<Query, QueryEngineResults> resultPair = executeQuerySwitchingImpl(options);
Query query = resultPair.getFirst();
QueryEngineResults results = resultPair.getSecond();
Map<String, ResultSet> wrapped = new HashMap<String, ResultSet>();
Map<Set<String>, ResultSet> map = results.getResults();
for (Set<String> group : map.keySet()) {
ResultSet current = map.get(group);
for (String selector : group) {
wrapped.put(selector, filterNotExistingNodes(current));
}
}
LimitBy limitBy = null;
if ((null != results.getResults()) && !results.getResults().isEmpty() && (null != results.getResults().values()) && !results.getResults().values().isEmpty()) {
limitBy = results.getResults().values().iterator().next().getResultSetMetaData().getLimitedBy();
}
CMISResultSet cmis = new CMISResultSet(wrapped, options, limitBy, nodeService, query, cmisDictionaryService, alfrescoDictionaryService);
return cmis;
}
use of org.alfresco.repo.search.impl.querymodel.Query in project alfresco-repository by Alfresco.
the class CMISQueryServiceImpl method executeQueryUsingEngine.
private Pair<Query, QueryEngineResults> executeQueryUsingEngine(QueryEngine queryEngine, CMISQueryOptions options) {
CapabilityJoin joinSupport = getJoinSupport();
if (options.getQueryMode() == CMISQueryOptions.CMISQueryMode.CMS_WITH_ALFRESCO_EXTENSIONS) {
joinSupport = CapabilityJoin.INNERANDOUTER;
}
// TODO: Refactor to avoid duplication of valid scopes here and in
// CMISQueryParser
BaseTypeId[] validScopes = (options.getQueryMode() == CMISQueryMode.CMS_STRICT) ? CmisFunctionEvaluationContext.STRICT_SCOPES : CmisFunctionEvaluationContext.ALFRESCO_SCOPES;
CmisFunctionEvaluationContext functionContext = new CmisFunctionEvaluationContext();
functionContext.setCmisDictionaryService(cmisDictionaryService);
functionContext.setNodeService(nodeService);
functionContext.setValidScopes(validScopes);
CMISQueryParser parser = new CMISQueryParser(options, cmisDictionaryService, joinSupport);
QueryConsistency queryConsistency = options.getQueryConsistency();
if (queryConsistency == QueryConsistency.DEFAULT) {
options.setQueryConsistency(QueryConsistency.EVENTUAL);
}
Query query = parser.parse(queryEngine.getQueryModelFactory(), functionContext);
QueryEngineResults queryEngineResults = queryEngine.executeQuery(query, options, functionContext);
return new Pair<Query, QueryEngineResults>(query, queryEngineResults);
}
use of org.alfresco.repo.search.impl.querymodel.Query in project alfresco-repository by Alfresco.
the class LuceneQueryEngine method executeQuery.
public QueryEngineResults executeQuery(Query query, QueryOptions options, FunctionEvaluationContext functionContext) {
Set<String> selectorGroup = null;
if (query.getSource() != null) {
List<Set<String>> selectorGroups = query.getSource().getSelectorGroups(functionContext);
if (selectorGroups.size() == 0) {
throw new UnsupportedOperationException("No selectors");
}
if (selectorGroups.size() > 1) {
throw new UnsupportedOperationException("Advanced join is not supported");
}
selectorGroup = selectorGroups.get(0);
}
SearchParameters searchParameters = new SearchParameters();
if (options.getLocales().size() > 0) {
for (Locale locale : options.getLocales()) {
searchParameters.addLocale(locale);
}
}
searchParameters.excludeDataInTheCurrentTransaction(!options.isIncludeInTransactionData());
searchParameters.setSkipCount(options.getSkipCount());
searchParameters.setMaxPermissionChecks(options.getMaxPermissionChecks());
searchParameters.setMaxPermissionCheckTimeMillis(options.getMaxPermissionCheckTimeMillis());
searchParameters.setDefaultFieldName(options.getDefaultFieldName());
searchParameters.setMlAnalaysisMode(options.getMlAnalaysisMode());
if (options.getMaxItems() >= 0) {
searchParameters.setLimitBy(LimitBy.FINAL_SIZE);
searchParameters.setLimit(options.getMaxItems());
searchParameters.setMaxItems(options.getMaxItems());
} else {
searchParameters.setLimitBy(LimitBy.UNLIMITED);
}
searchParameters.setUseInMemorySort(options.getUseInMemorySort());
searchParameters.setMaxRawResultSetSizeForInMemorySort(options.getMaxRawResultSetSizeForInMemorySort());
searchParameters.setBulkFetchEnabled(options.isBulkFetchEnabled());
searchParameters.setQueryConsistency(options.getQueryConsistency());
try {
StoreRef storeRef = options.getStores().get(0);
searchParameters.addStore(storeRef);
if (query instanceof LuceneQueryBuilder) {
SearchService searchService = indexAndSearcher.getSearcher(storeRef, options.isIncludeInTransactionData());
if (searchService instanceof LuceneSearcher) {
LuceneSearcher luceneSearcher = (LuceneSearcher) searchService;
ClosingIndexSearcher searcher = luceneSearcher.getClosingIndexSearcher();
LuceneQueryBuilderContext<org.apache.lucene.search.Query, Sort, ParseException> luceneContext = new LuceneQueryBuilderContextImpl(dictionaryService, namespaceService, tenantService, searchParameters, indexAndSearcher.getDefaultMLSearchAnalysisMode(), searcher.getIndexReader());
@SuppressWarnings("unchecked") LuceneQueryBuilder<org.apache.lucene.search.Query, Sort, ParseException> builder = (LuceneQueryBuilder<org.apache.lucene.search.Query, Sort, ParseException>) query;
org.apache.lucene.search.Query luceneQuery = builder.buildQuery(selectorGroup, luceneContext, functionContext);
if (logger.isDebugEnabled()) {
logger.debug("Executing lucene query: " + luceneQuery);
}
Sort sort = builder.buildSort(selectorGroup, luceneContext, functionContext);
Hits hits = searcher.search(luceneQuery);
boolean postSort = false;
;
if (sort != null) {
postSort = searchParameters.usePostSort(hits.length(), useInMemorySort, maxRawResultSetSizeForInMemorySort);
if (postSort == false) {
hits = searcher.search(luceneQuery, sort);
}
}
ResultSet answer;
ResultSet result = new LuceneResultSet(hits, searcher, nodeService, tenantService, searchParameters, indexAndSearcher);
if (postSort) {
if (sort != null) {
for (SortField sf : sort.getSort()) {
searchParameters.addSort(sf.getField(), !sf.getReverse());
}
}
ResultSet sorted = new SortedResultSet(result, nodeService, builder.buildSortDefinitions(selectorGroup, luceneContext, functionContext), namespaceService, dictionaryService, searchParameters.getSortLocale());
answer = sorted;
} else {
answer = result;
}
ResultSet rs = new PagingLuceneResultSet(answer, searchParameters, nodeService);
Map<Set<String>, ResultSet> map = new HashMap<Set<String>, ResultSet>(1);
map.put(selectorGroup, rs);
return new QueryEngineResults(map);
} else {
throw new UnsupportedOperationException();
}
} else {
throw new UnsupportedOperationException();
}
} catch (ParseException e) {
throw new SearcherException("Failed to parse query: " + e);
} catch (IOException e) {
throw new SearcherException("IO exception during search", e);
}
}
use of org.alfresco.repo.search.impl.querymodel.Query in project alfresco-repository by Alfresco.
the class SolrOpenCMISQueryServiceImpl method query.
@Override
public CMISResultSet query(CMISQueryOptions options) {
SearchParameters searchParameters = options.getAsSearchParmeters();
searchParameters.addExtraParameter("cmisVersion", options.getCmisVersion().toString());
ResultSet rs = solrQueryLanguage.executeQuery(searchParameters);
CapabilityJoin joinSupport = getJoinSupport();
if (options.getQueryMode() == CMISQueryOptions.CMISQueryMode.CMS_WITH_ALFRESCO_EXTENSIONS) {
joinSupport = CapabilityJoin.INNERANDOUTER;
}
// TODO: Refactor to avoid duplication of valid scopes here and in CMISQueryParser
BaseTypeId[] validScopes = (options.getQueryMode() == CMISQueryMode.CMS_STRICT) ? CmisFunctionEvaluationContext.STRICT_SCOPES : CmisFunctionEvaluationContext.ALFRESCO_SCOPES;
CmisFunctionEvaluationContext functionContext = new CmisFunctionEvaluationContext();
functionContext.setCmisDictionaryService(cmisDictionaryService);
functionContext.setNodeService(nodeService);
functionContext.setValidScopes(validScopes);
CMISQueryParser parser = new CMISQueryParser(options, cmisDictionaryService, joinSupport);
Query query = parser.parse(new LuceneQueryModelFactory(), functionContext);
Map<String, ResultSet> wrapped = new HashMap<String, ResultSet>();
for (Set<String> group : query.getSource().getSelectorGroups(functionContext)) {
for (String selector : group) {
wrapped.put(selector, rs);
}
}
LimitBy limitBy = null;
limitBy = rs.getResultSetMetaData().getLimitedBy();
CMISResultSet cmis = new CMISResultSet(wrapped, options, limitBy, nodeService, query, cmisDictionaryService, alfrescoDictionaryService);
return cmis;
}
Aggregations