package com.constellio.model.services.search.query.logical.condition;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;
import com.constellio.model.services.search.query.logical.LogicalOperator;
import com.constellio.model.services.search.query.logical.LogicalSearchValueCondition;
public class CompositeLogicalSearchCondition extends LogicalSearchCondition {
final LogicalOperator logicalOperator;
final List<LogicalSearchCondition> nestedSearchConditions;
public CompositeLogicalSearchCondition(DataStoreFilters filters, LogicalOperator logicalOperator,
List<LogicalSearchCondition> nestedSearchConditions) {
super(filters);
this.logicalOperator = logicalOperator;
this.nestedSearchConditions = Collections.unmodifiableList(nestedSearchConditions);
}
public LogicalOperator getLogicalOperator() {
return logicalOperator;
}
public List<LogicalSearchCondition> getNestedSearchConditions() {
return nestedSearchConditions;
}
@Override
public String toString() {
return filters + ":" + logicalOperator.name() + nestedSearchConditions;
}
@Override
public LogicalSearchCondition withFilters(DataStoreFilters filters) {
List<LogicalSearchCondition> searchConditionsWithSchema = new ArrayList<>();
for (LogicalSearchCondition condition : nestedSearchConditions) {
searchConditionsWithSchema.add(condition.withFilters(filters));
}
return new CompositeLogicalSearchCondition(filters, logicalOperator, searchConditionsWithSchema);
}
@Override
public LogicalSearchCondition withOrValueConditions(List<LogicalSearchValueCondition> conditions) {
throw new UnsupportedOperationException("Cannot add value conditions on a compocollection");
}
@Override
public LogicalSearchCondition withAndValueConditions(List<LogicalSearchValueCondition> conditions) {
throw new UnsupportedOperationException("Cannot add value conditions on a compocollection");
}
@Override
public int hashCode() {
return HashCodeBuilder.reflectionHashCode(this);
}
@Override
public boolean equals(Object obj) {
return EqualsBuilder.reflectionEquals(this, obj);
}
@Override
public void validate() {
}
@Override
public String getSolrQuery(SolrQueryBuilderParams params) {
if (nestedSearchConditions.isEmpty()) {
throw new IllegalStateException("No conditions");
}
String query = "(";
for (int i = 0; i < nestedSearchConditions.size() - 1; i++) {
query += " " + nestedSearchConditions.get(i).getSolrQuery(params) + " " + logicalOperator;
}
query += " " + nestedSearchConditions.get(nestedSearchConditions.size() - 1).getSolrQuery(params);
query += " )";
return query;
}
}