use of org.alfresco.repo.search.impl.querymodel.Ordering in project SearchServices by Alfresco.
the class AlfrescoSolrDataModel method getFTSQuery.
/**
* @param searchParametersAndFilter Pair<SearchParameters, Boolean>
* @param req SolrQueryRequest
* @return Query
* @throws ParseException
*/
public Query getFTSQuery(Pair<SearchParameters, Boolean> searchParametersAndFilter, SolrQueryRequest req, FTSQueryParser.RerankPhase rerankPhase) throws ParseException {
SearchParameters searchParameters = searchParametersAndFilter.getFirst();
Boolean isFilter = searchParametersAndFilter.getSecond();
QueryModelFactory factory = new LuceneQueryModelFactory<Query, Sort, SyntaxError>();
AlfrescoFunctionEvaluationContext functionContext = new AlfrescoSolr4FunctionEvaluationContext(namespaceDAO, getDictionaryService(CMISStrictDictionaryService.DEFAULT), NamespaceService.CONTENT_MODEL_1_0_URI, req.getSchema());
FTSParser.Mode mode;
if (searchParameters.getDefaultFTSOperator() == org.alfresco.service.cmr.search.SearchParameters.Operator.AND) {
mode = FTSParser.Mode.DEFAULT_CONJUNCTION;
} else {
mode = FTSParser.Mode.DEFAULT_DISJUNCTION;
}
Constraint constraint = FTSQueryParser.buildFTS(searchParameters.getQuery(), factory, functionContext, null, null, mode, searchParameters.getDefaultFTSOperator() == org.alfresco.service.cmr.search.SearchParameters.Operator.OR ? Connective.OR : Connective.AND, searchParameters.getQueryTemplates(), searchParameters.getDefaultFieldName(), rerankPhase);
org.alfresco.repo.search.impl.querymodel.Query queryModelQuery = factory.createQuery(null, null, constraint, new ArrayList<Ordering>());
@SuppressWarnings("unchecked") LuceneQueryBuilder<Query, Sort, ParseException> builder = (LuceneQueryBuilder<Query, Sort, ParseException>) queryModelQuery;
LuceneQueryBuilderContext<Query, Sort, ParseException> luceneContext = getLuceneQueryBuilderContext(searchParameters, req, CMISStrictDictionaryService.DEFAULT, rerankPhase);
Set<String> selectorGroup = null;
if (queryModelQuery.getSource() != null) {
List<Set<String>> selectorGroups = queryModelQuery.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);
}
Query luceneQuery = builder.buildQuery(selectorGroup, luceneContext, functionContext);
// query needs some search parameters fro correct caching ....
ContextAwareQuery contextAwareQuery = new ContextAwareQuery(luceneQuery, Boolean.TRUE.equals(isFilter) ? null : searchParameters);
return contextAwareQuery;
}
use of org.alfresco.repo.search.impl.querymodel.Ordering in project alfresco-repository by Alfresco.
the class DBQuery method buildPredicateCommands.
/*
* (non-Javadoc)
* @see org.alfresco.repo.search.impl.querymodel.impl.db.DBQueryBuilderComponent#buildPredicateCommands()
*/
@Override
public void buildPredicateCommands(List<DBQueryBuilderPredicatePartCommand> predicatePartCommands) {
boolean requiresAnd = false;
if (selectorGroup != null) {
for (String selector : selectorGroup) {
Selector current = getSource().getSelector(selector);
if (current instanceof DBQueryBuilderComponent) {
if (requiresAnd) {
DBQueryBuilderPredicatePartCommand and = new DBQueryBuilderPredicatePartCommand();
and.setType(DBQueryBuilderPredicatePartCommandType.AND);
predicatePartCommands.add(and);
}
((DBQueryBuilderComponent) current).buildPredicateCommands(predicatePartCommands);
requiresAnd = true;
} else {
throw new UnsupportedOperationException();
}
}
}
if (getConstraint() != null) {
if (getConstraint() instanceof DBQueryBuilderComponent) {
if (requiresAnd) {
DBQueryBuilderPredicatePartCommand and = new DBQueryBuilderPredicatePartCommand();
and.setType(DBQueryBuilderPredicatePartCommandType.AND);
predicatePartCommands.add(and);
}
((DBQueryBuilderComponent) getConstraint()).buildPredicateCommands(predicatePartCommands);
} else {
throw new UnsupportedOperationException();
}
}
if (getOrderings() != null) {
for (Ordering ordering : getOrderings()) {
if (ordering instanceof DBQueryBuilderComponent) {
((DBQueryBuilderComponent) ordering).buildPredicateCommands(predicatePartCommands);
} else {
throw new UnsupportedOperationException();
}
}
}
}
use of org.alfresco.repo.search.impl.querymodel.Ordering in project alfresco-repository by Alfresco.
the class AbstractAlfrescoFtsQueryLanguage method buildOrderings.
public List<Ordering> buildOrderings(QueryModelFactory factory, SearchParameters searchParameters) {
List<Ordering> orderings = new ArrayList<Ordering>(searchParameters.getSortDefinitions().size());
for (SortDefinition sd : searchParameters.getSortDefinitions()) {
if (sd.getSortType() == SortType.FIELD) {
Function function = factory.getFunction(PropertyAccessor.NAME);
Argument arg = factory.createPropertyArgument(PropertyAccessor.ARG_PROPERTY, true, true, "", sd.getField());
Map<String, Argument> functionArguments = new LinkedHashMap<String, Argument>();
functionArguments.put(arg.getName(), arg);
Column column = factory.createColumn(function, functionArguments, sd.getField());
Order order = sd.isAscending() ? Order.ASCENDING : Order.DESCENDING;
Ordering ordering = factory.createOrdering(column, order);
orderings.add(ordering);
} else if (sd.getSortType() == SortType.SCORE) {
Function function = factory.getFunction(Score.NAME);
Map<String, Argument> functionArguments = new LinkedHashMap<String, Argument>();
Column column = factory.createColumn(function, functionArguments, Score.NAME);
Order order = sd.isAscending() ? Order.ASCENDING : Order.DESCENDING;
Ordering ordering = factory.createOrdering(column, order);
orderings.add(ordering);
} else {
throw new UnsupportedOperationException("Unsupported Ordering " + sd.getSortType());
}
}
return orderings;
}
Aggregations