package com.constellio.model.services.search.query.logical.condition; import java.util.Arrays; import java.util.List; import org.apache.commons.lang3.builder.EqualsBuilder; import org.apache.commons.lang3.builder.HashCodeBuilder; import com.constellio.model.entities.schemas.DataStoreField; import com.constellio.model.services.search.query.logical.LogicalOperator; import com.constellio.model.services.search.query.logical.LogicalSearchValueCondition; import com.constellio.model.services.search.query.logical.ongoing.OngoingLogicalSearchConditionWithDataStoreFields; public abstract class LogicalSearchCondition { protected final DataStoreFilters filters; public LogicalSearchCondition(DataStoreFilters filters) { super(); this.filters = filters; } public abstract void validate(); public LogicalSearchCondition or(List<LogicalSearchValueCondition> conditions) { return this.withOrValueConditions(conditions); } public LogicalSearchCondition or(LogicalSearchValueCondition conditions) { return this.withOrValueConditions(Arrays.asList(conditions)); } public LogicalSearchCondition and(List<LogicalSearchValueCondition> conditions) { return this.withAndValueConditions(conditions); } public LogicalSearchCondition and(LogicalSearchValueCondition conditions) { return this.withAndValueConditions(Arrays.asList(conditions)); } public OngoingLogicalSearchConditionWithDataStoreFields orWhere(DataStoreField dataStoreField) { return orWhereAll(Arrays.asList(dataStoreField)); } public OngoingLogicalSearchConditionWithDataStoreFields orWhereAll(List<DataStoreField> dataStoreFields) { return new OngoingLogicalSearchConditionWithDataStoreFields(filters, dataStoreFields, LogicalOperator.AND, this, LogicalOperator.OR); } public OngoingLogicalSearchConditionWithDataStoreFields orWhereAny(List<?> dataStoreFields) { return new OngoingLogicalSearchConditionWithDataStoreFields(filters, (List) dataStoreFields, LogicalOperator.OR, this, LogicalOperator.OR); } public LogicalSearchCondition andWhere(DataStoreFieldLogicalSearchCondition condition) { if (condition.getMetadataLogicalOperator() == LogicalOperator.AND) { return this.andWhereAll(condition.getDataStoreFields()).is(condition.getValueCondition()); } else { return this.andWhereAny(condition.getDataStoreFields()).is(condition.getValueCondition()); } } public LogicalSearchCondition orWhere(DataStoreFieldLogicalSearchCondition condition) { if (condition.getMetadataLogicalOperator() == LogicalOperator.AND) { return this.orWhereAll(condition.getDataStoreFields()).is(condition.getValueCondition()); } else { return this.orWhereAny(condition.getDataStoreFields()).is(condition.getValueCondition()); } } public LogicalSearchCondition andWhere(ConditionTemplate template) { if (template.getOperator() == LogicalOperator.AND) { return andWhereAll((List<DataStoreField>) template.getFields()).is(template.getCondition()); } else { return andWhereAny((List<DataStoreField>) template.getFields()).is(template.getCondition()); } } public LogicalSearchCondition orWhere(ConditionTemplate template) { if (template.getOperator() == LogicalOperator.AND) { return orWhereAll((List<DataStoreField>) template.getFields()).is(template.getCondition()); } else { return orWhereAny((List<DataStoreField>) template.getFields()).is(template.getCondition()); } } public OngoingLogicalSearchConditionWithDataStoreFields andWhere(DataStoreField dataStoreField) { return andWhereAll(Arrays.asList(dataStoreField)); } public OngoingLogicalSearchConditionWithDataStoreFields andWhereAll(List<DataStoreField> dataStoreFields) { return new OngoingLogicalSearchConditionWithDataStoreFields(filters, dataStoreFields, LogicalOperator.AND, this, LogicalOperator.AND); } public OngoingLogicalSearchConditionWithDataStoreFields andWhereAny(List<DataStoreField> dataStoreFields) { return new OngoingLogicalSearchConditionWithDataStoreFields(filters, dataStoreFields, LogicalOperator.OR, this, LogicalOperator.AND); } public LogicalSearchCondition negated() { return new NegatedLogicalSearchCondition(this); } @Override public int hashCode() { return HashCodeBuilder.reflectionHashCode(this); } @Override public boolean equals(Object obj) { return EqualsBuilder.reflectionEquals(this, obj); } public abstract LogicalSearchCondition withFilters(DataStoreFilters filters); public abstract LogicalSearchCondition withOrValueConditions(List<LogicalSearchValueCondition> conditions); public abstract LogicalSearchCondition withAndValueConditions(List<LogicalSearchValueCondition> conditions); public abstract String getSolrQuery(SolrQueryBuilderParams params); public DataStoreFilters getFilters() { return filters; } public boolean isCollectionSearch() { return filters != null; } public String getCollection() { return filters.getCollection(); } }