private MapXNodeImpl serializeFullTextFilter(FullTextFilter filter) throws SchemaException { MapXNodeImpl clauseMap = new MapXNodeImpl(); if (filter.getValues() != null && !filter.getValues().isEmpty()) { ListXNodeImpl valuesNode = new ListXNodeImpl(); for (String value : filter.getValues()) { XNodeImpl val = createPrimitiveXNode(value, DOMUtil.XSD_STRING); valuesNode.add(val); } clauseMap.put(ELEMENT_VALUE, valuesNode); } else if (filter.getExpression() != null) { // TODO serialize expression } else { throw new SchemaException("FullText filter with no values nor expression"); } return createFilter(CLAUSE_FULL_TEXT, clauseMap); }
ExpressionWrapper expressionWrapper = ((FullTextFilter) filter).getExpression(); if (expressionMissing(expressionWrapper, filter, shortDesc)) { return filter.clone(); evaluatedFilter.setValues(expressionResult); evaluatedFilter.setExpression(null); if (LOGGER.isTraceEnabled()) { LOGGER.trace("Transformed filter to:\n{}", evaluatedFilter.debugDump());
private static boolean containExpression(ObjectFilter filter){ if (filter == null){ return false; } if (filter instanceof InOidFilter && ((InOidFilter) filter).getExpression() != null) { return true; } if (filter instanceof FullTextFilter && ((FullTextFilter) filter).getExpression() != null) { return true; } if (filter instanceof ValueFilter && ((ValueFilter) filter).getExpression() != null) { return true; } return false; }
@Override public Condition interpret() throws QueryException { // TODO implement multiple values if (filter.getValues().size() != 1) { throw new QueryException("FullText filter currently supports only a single string"); } String text = filter.getValues().iterator().next(); String normalized = getContext().getPrismContext().getDefaultPolyStringNormalizer().normalize(text); String[] words = StringUtils.split(normalized); List<Condition> conditions = new ArrayList<>(words.length); for (String word : words) { conditions.add(createWordQuery(word)); } if (conditions.isEmpty()) { return createWordQuery(""); // original behavior -> match all records (TODO return something like 'empty condition') } else if (conditions.size() == 1) { return conditions.get(0); } else { return getContext().getHibernateQuery().createAnd(conditions); } }