package com.constellio.model.services.search.query.logical.ongoing; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import com.constellio.model.entities.schemas.DataStoreField; import com.constellio.model.entities.schemas.Metadata; import com.constellio.model.services.search.query.logical.LogicalOperator; import com.constellio.model.services.search.query.logical.condition.CompositeLogicalSearchCondition; import com.constellio.model.services.search.query.logical.condition.ConditionTemplate; import com.constellio.model.services.search.query.logical.condition.DataStoreFieldLogicalSearchCondition; import com.constellio.model.services.search.query.logical.condition.DataStoreFilters; import com.constellio.model.services.search.query.logical.condition.LogicalSearchCondition; import com.constellio.model.services.search.query.logical.condition.LogicalSearchConditionBuilder; public class OngoingLogicalSearchCondition { private final DataStoreFilters filters; public OngoingLogicalSearchCondition(DataStoreFilters filters) { super(); this.filters = filters; } public OngoingLogicalSearchConditionWithDataStoreFields where(DataStoreField dataStoreField) { return new OngoingLogicalSearchConditionWithDataStoreFields(filters, Arrays.asList(dataStoreField), LogicalOperator.AND); } public LogicalSearchCondition where(LogicalSearchConditionBuilder builder) { return builder.build(this); } public LogicalSearchCondition where(ConditionTemplate template) { if (template.getOperator() == LogicalOperator.AND) { return whereAll(template.getFields()).is(template.getCondition()); } else { return whereAny(template.getFields()).is(template.getCondition()); } } public OngoingLogicalSearchConditionWithDataStoreFields whereAll(Metadata... metadatas) { return new OngoingLogicalSearchConditionWithDataStoreFields(filters, asFieldList(metadatas), LogicalOperator.AND); } public OngoingLogicalSearchConditionWithDataStoreFields whereAll(DataStoreField... dataStoreFields) { return new OngoingLogicalSearchConditionWithDataStoreFields(filters, Arrays.asList(dataStoreFields), LogicalOperator.AND); } public OngoingLogicalSearchConditionWithDataStoreFields whereAll(List<?> dataStoreFields) { return new OngoingLogicalSearchConditionWithDataStoreFields(filters, (List<DataStoreField>) dataStoreFields, LogicalOperator.AND); } public OngoingLogicalSearchConditionWithDataStoreFields whereAny(Metadata... dataStoreFields) { return new OngoingLogicalSearchConditionWithDataStoreFields(filters, asFieldList(dataStoreFields), LogicalOperator.OR); } public OngoingLogicalSearchConditionWithDataStoreFields whereAny(DataStoreField... dataStoreFields) { return new OngoingLogicalSearchConditionWithDataStoreFields(filters, Arrays.asList(dataStoreFields), LogicalOperator.OR); } public OngoingLogicalSearchConditionWithDataStoreFields whereAny(List<?> dataStoreFields) { return new OngoingLogicalSearchConditionWithDataStoreFields(filters, (List<DataStoreField>) dataStoreFields, LogicalOperator.OR); } public LogicalSearchCondition where(LogicalSearchCondition whereClause) { return whereClause.withFilters(filters); } public LogicalSearchCondition whereAllConditions(LogicalSearchCondition... whereClauses) { return whereAllConditions(Arrays.asList(whereClauses)); } public LogicalSearchCondition whereAllConditions(List<LogicalSearchCondition> whereClauses) { return new CompositeLogicalSearchCondition(filters, LogicalOperator.AND, withSchema(whereClauses)); } public LogicalSearchCondition whereAnyCondition(LogicalSearchCondition... whereClauses) { return whereAnyCondition(Arrays.asList(whereClauses)); } public LogicalSearchCondition whereAnyCondition(List<LogicalSearchCondition> whereClauses) { return new CompositeLogicalSearchCondition(filters, LogicalOperator.OR, withSchema(whereClauses)); } private List<LogicalSearchCondition> withSchema(List<LogicalSearchCondition> whereClauses) { List<LogicalSearchCondition> searchConditions = new ArrayList<>(); for (LogicalSearchCondition condition : whereClauses) { searchConditions.add(condition.withFilters(filters)); } return searchConditions; } ; public LogicalSearchCondition returnAll() { return new DataStoreFieldLogicalSearchCondition(filters); } private List<DataStoreField> asFieldList(Metadata... metadatas) { List<DataStoreField> fields = new ArrayList<>(); for (Metadata metadata : metadatas) { fields.add(metadata); } return fields; } }