use of org.structr.core.graph.search.EmptySearchAttribute in project structr by structr.
the class CollectionNotionProperty method getSearchAttribute.
@Override
public SearchAttribute getSearchAttribute(SecurityContext securityContext, Occurrence occur, List<T> searchValues, boolean exactMatch, final Query query) {
final Predicate<GraphObject> predicate = query != null ? query.toPredicate() : null;
final SourceSearchAttribute attr = new SourceSearchAttribute(occur);
final Set<GraphObject> intersectionResult = new LinkedHashSet<>();
boolean alreadyAdded = false;
try {
if (searchValues != null && !searchValues.isEmpty()) {
final PropertyKey key = notion.getPrimaryPropertyKey();
final PropertyConverter inputConverter = key.inputConverter(securityContext);
final List<Object> transformedValues = new LinkedList<>();
boolean allBlank = true;
// transform search values using input convert of notion property
for (T searchValue : searchValues) {
if (inputConverter != null) {
transformedValues.add(inputConverter.convert(searchValue));
} else {
transformedValues.add(searchValue);
}
}
// iterate over transformed values
for (Object searchValue : transformedValues) {
// check if the list contains non-empty search values
if (StringUtils.isBlank(searchValue.toString())) {
continue;
} else {
allBlank = false;
}
final App app = StructrApp.getInstance(securityContext);
if (exactMatch) {
Result<AbstractNode> result = app.nodeQuery(collectionProperty.relatedType()).and(notion.getPrimaryPropertyKey(), searchValue).getResult();
for (AbstractNode node : result.getResults()) {
switch(occur) {
case REQUIRED:
if (!alreadyAdded) {
// the first result is the basis of all subsequent intersections
intersectionResult.addAll(collectionProperty.getRelatedNodesReverse(securityContext, node, declaringClass, predicate));
// the next additions are intersected with this one
alreadyAdded = true;
} else {
intersectionResult.retainAll(collectionProperty.getRelatedNodesReverse(securityContext, node, declaringClass, predicate));
}
break;
case OPTIONAL:
intersectionResult.addAll(collectionProperty.getRelatedNodesReverse(securityContext, node, declaringClass, predicate));
break;
case FORBIDDEN:
break;
}
}
} else {
Result<AbstractNode> result = app.nodeQuery(collectionProperty.relatedType()).and(notion.getPrimaryPropertyKey(), searchValue, false).getResult();
// loose search behaves differently, all results must be combined
for (AbstractNode node : result.getResults()) {
intersectionResult.addAll(collectionProperty.getRelatedNodesReverse(securityContext, node, declaringClass, predicate));
}
}
}
if (allBlank) {
// value in the given field
return new EmptySearchAttribute(this, Collections.emptyList());
} else {
attr.setResult(intersectionResult);
}
} else {
// value in the given field
return new EmptySearchAttribute(this, Collections.emptyList());
}
} catch (FrameworkException fex) {
logger.warn("", fex);
}
return attr;
}
Aggregations