@Override protected boolean isCriterionSupported(SearchCriterion criterion) { if (criterion instanceof BooleanCriterion) { for (SearchCriterion subcriterion : ((BooleanCriterion) criterion).getCriteria()) { if (!(subcriterion instanceof FieldCriterion)) { return false; } } return true; } return false; }
public static boolean isCriterionEmpty(SearchCriterion criterion) { if (criterion instanceof BooleanCriterion) { return ((BooleanCriterion)criterion).getCriteria().isEmpty(); } return criterion == null; } }
@Override protected SearchCriterion booleanCriterionHandler(BooleanCriterion criterion, SearchScheme scheme, SearchCriterionTransformerHint hint) { ListIterator<SearchCriterion> it = criterion.getCriteria().listIterator(); while(it.hasNext()) { SearchCriterion subcriterion = it.next(); it.set(transform(subcriterion, scheme, hint)); } return criterion; }
@Override protected SearchCriterion booleanCriterionHandler(BooleanCriterion criterion, SearchScheme scheme, SearchCriterionTransformerHint hint) { ListIterator<SearchCriterion> it = criterion.getCriteria().listIterator(); while(it.hasNext()) { SearchCriterion subcriterion = it.next(); it.set(transform(subcriterion, scheme, hint)); } return criterion; }
@Override protected SearchCriterion booleanCriterionHandler(BooleanCriterion criterion, SearchScheme scheme, SearchCriterionTransformerHint hint) { ListIterator<SearchCriterion> it = criterion.getCriteria().listIterator(); while(it.hasNext()) { SearchCriterion subcriterion = it.next(); SearchCriterion transformedSubcriterion = transform(subcriterion, scheme, hint); if (isCriterionEmpty(transformedSubcriterion)) { it.remove(); } else { it.set(transformedSubcriterion); } } if (criterion.getCriteria().size() == 1) { return criterion.getCriteria().get(0); } return criterion; }
/** * Creates the boolean query.<BR> * Format: <code> * ( booleanQuery ) * </code> * * @param booleanCriterion the boolean criterion * @param schema the fields metadata * @return the single boolean query * */ private String createBooleanQuery(final BooleanCriterion booleanCriterion, final FulltextIndexSchema schema) { final String booleanQuery = constructQuery(booleanCriterion.getCriteria(), null, schema, 0); if (StringUtils.hasText(booleanQuery)) { final StringBuilder query = new StringBuilder(); query.append('(').append(booleanQuery).append(')'); return query.toString(); } else { return ""; } }
List<String> criterionsOrder = new ArrayList<>(); ListIterator<SearchCriterion> it = criterion.getCriteria().listIterator(); while (it.hasNext()) { SearchCriterion subcriterion = it.next(); T mergedCondition = mergeConditions(entry.getValue()); if (mergedCondition != null) { ((BooleanCriterion) criterion).getCriteria().add(mergedCondition); Collections.sort(((BooleanCriterion) criterion).getCriteria(), new ListPositionBasedCriterionComparator<SearchCriterion>(criterionsOrder)); if (criterion.getCriteria().size() == 1) { if (criterion.getOperator() == SearchOperator.OR) { criterion.getCriteria().get(0).setOperator(SearchOperator.OR); return criterion.getCriteria().get(0);
@Override protected BooleanCriterion mergeConditions(List<BooleanCriterion> criterions) { if (CollectionUtils.isEmpty(criterions)) { return null; } BooleanCriterion result = new BooleanCriterion(); result.setOperator(criterions.get(0).getOperator()); Map<String, List<FieldCriterion>> subCriterionsToMerge = new HashMap<>(); List<String> criterionsOrder = new ArrayList<>(); for (BooleanCriterion criterion : criterions) { for(SearchCriterion subCriterion : criterion.getCriteria()){ fieldCriterionMerger.addToMergeList(subCriterionsToMerge, (FieldCriterion) subCriterion); criterionsOrder.add(ListPositionBasedCriterionComparator.extractFieldHash(subCriterion)); } } for (Map.Entry<String, List<FieldCriterion>> entry : subCriterionsToMerge.entrySet()) { FieldCriterion mergedCondition = fieldCriterionMerger.mergeConditions(entry.getValue()); if (mergedCondition != null) { result.getCriteria().add(mergedCondition); } } if (subCriterionsToMerge.size() > 0 && criterionsOrder.size() > 1) { Collections.sort(result.getCriteria(), new ListPositionBasedCriterionComparator<SearchCriterion>(criterionsOrder)); } return result; }
public SearchCriterion transformConditionsListToSearchCriterion(List<FieldCondition> conditions, SearchOperator mainOperator) { BooleanCriterion bc = new BooleanCriterion(); bc.setOperator(SearchOperator.AND); for (FieldCondition condition : conditions) { if (condition instanceof AdvancedFieldCondition) { bc.addCriterion(advancedFieldConditionToBooleanCriterion((AdvancedFieldCondition)condition, mainOperator)); } else { bc.addCriterion(fieldConditionToFieldCriterion(condition, mainOperator)); } } if (bc.getCriteria().size() == 1) { return bc.getCriteria().get(0); } return bc; }
List<FieldCriterion> multipleFields = new LinkedList<FieldCriterion>(); ListIterator<SearchCriterion> it = criterion.getCriteria().listIterator(); while(it.hasNext()) { SearchCriterion subcriterion = it.next(); BooleanCriterion expandedCondition = expandMultipleField(fieldCriterion, scheme.getMultipleFields().get(fieldCriterion.getField())); if (fieldCriterion.getOperator() == SearchOperator.NOT) { for (SearchCriterion singleExpandedCondition : expandedCondition.getCriteria()) { criterion.getCriteria().add(singleExpandedCondition); expandedCondition.setOperator(SearchOperator.OR); criterion.getCriteria().add(expandedCondition);
public SearchCriterion transformRequestToSearchCriterion(AdvancedSearchRequest request) { SearchOperator mainOperator = getSearchOperator(request.getExpressionsOperator()); BooleanCriterion bc = new BooleanCriterion(); bc.setOperator(SearchOperator.AND); for (Map.Entry<String, AdvancedFieldCondition> conditionEntry : request.getFieldsHierarchy().entrySet()) { if (conditionEntry.getValue().getConditionType().equals(AdvancedFieldConditionType.NORMAL)) { bc.addCriterion(advancedFieldConditionToBooleanCriterion(conditionEntry.getValue(), mainOperator)); } } if (bc.getCriteria().size() == 1) { return bc.getCriteria().get(0); } return bc; }
public static String extractFieldHash(SearchCriterion criterion) { if (criterion instanceof FieldCriterion) { return ((FieldCriterion) criterion).getField() + criterion.getOperator().getName(); } else if (criterion instanceof FieldRangeCriterion) { return ((FieldRangeCriterion) criterion).getField(); } else if (criterion instanceof BooleanCriterion) { return "boolean" + extractFieldHash(((BooleanCriterion) criterion).getCriteria().get(0)); } else { return StringUtils.EMPTY; } }
if (bc.getCriteria().size() == 0) { return null; if (bc.getCriteria().size() == 1) { if (bc.getCriteria().get(0).getOperator() != SearchOperator.NOT) { bc.getCriteria().get(0).setOperator(bc.getOperator()); return bc.getCriteria().get(0);
public void translateSearchCriterionToFormField(SearchCriterion criterion, List<AdvancedFormFieldCondition> advancedForm, BooleanCriterion parent, SearchScheme scheme) { if (criterion instanceof BooleanCriterion) { BooleanCriterion bc = (BooleanCriterion)criterion; boolean firstChild = true; for (SearchCriterion subcriterion : bc.getCriteria()) { translateSearchCriterionToFormField(subcriterion, advancedForm, bc, scheme); if (firstChild && parent != null && bc.getOperator() == SearchOperator.OR) { advancedForm.get(advancedForm.size()-1).setOperator(AdvancedFormFieldCondition.OR_OPERATOR); } else if (firstChild && parent != null) { advancedForm.get(advancedForm.size()-1).setOperator(AdvancedFormFieldCondition.AND_OPERATOR); } firstChild = false; } } else if (criterion instanceof FieldCriterion) { FieldCriterion fieldCriterion = (FieldCriterion)criterion; String presentationFieldName = getPresentationFieldName(scheme, fieldCriterion.getField()); advancedForm.add(new AdvancedFormFieldCondition(translateSearchOperator(fieldCriterion.getOperator(), parent), presentationFieldName, fieldCriterion.getValue())); } else if (criterion instanceof FieldRangeCriterion) { FieldRangeCriterion fieldRangeCriterion = (FieldRangeCriterion)criterion; String presentationFieldName = getPresentationFieldName(scheme, fieldRangeCriterion.getField()); advancedForm.add(new AdvancedFormFieldCondition(translateSearchOperator(fieldRangeCriterion.getOperator(), parent), presentationFieldName, new String[] {fieldRangeCriterion.getFrom(), fieldRangeCriterion.getTo()})); } }
case BOOLEAN: criterionQueryType = detectQueryType(((BooleanCriterion) criterion).getCriteria(), schema); break; default: