package com.constellio.app.ui.pages.search.criteria;
import java.io.Serializable;
import com.constellio.app.ui.entities.MetadataVO;
import com.constellio.model.entities.schemas.Metadata;
import com.constellio.model.entities.schemas.MetadataValueType;
import com.constellio.model.entities.schemas.ModifiableStructure;
import com.constellio.model.services.schemas.builders.CommonMetadataBuilder;
public class Criterion implements Serializable, ModifiableStructure {
public enum BooleanOperator {AND, OR, AND_NOT}
public enum SearchOperator {
EQUALS,
CONTAINS_TEXT,
LESSER_THAN,
GREATER_THAN,
BETWEEN,
IS_TRUE,
IS_FALSE,
IN_HIERARCHY,
IS_NULL,
IS_NOT_NULL
}
private String schemaType;
String metadataCode;
MetadataValueType metadataType;
String enumClassName;
private SearchOperator searchOperator;
private Object value;
private Object endValue;
private boolean leftParens;
private boolean rightParens;
private BooleanOperator booleanOperator;
boolean dirty;
private RelativeCriteria relativeCriteria = new RelativeCriteria();
public Criterion() {
}
public Criterion(String schemaType) {
setSchemaType(schemaType);
}
@Override
public boolean isDirty() {
return dirty;
}
public String getSchemaType() {
return schemaType;
}
public void setSchemaType(String schemaType) {
dirty = true;
this.schemaType = schemaType;
metadataCode = null;
metadataType = null;
value = endValue = null;
leftParens = rightParens = false;
booleanOperator = BooleanOperator.AND;
}
public String getMetadataCode() {
return metadataCode;
}
public void setMetadata(Metadata metadata) {
Class<? extends Enum<?>> enumClass = metadata.getEnumClass();
setMetadata(metadata.getCode(), metadata.getType(), enumClass == null ? null : enumClass.getName());
}
public void setMetadata(String metadataCode, MetadataValueType type, String enumClassName) {
if (MetadataVO.getCodeWithoutPrefix(metadataCode).equals(CommonMetadataBuilder.PATH)) {
searchOperator = SearchOperator.IN_HIERARCHY;
} else if (type.isStringOrText()) {
searchOperator = SearchOperator.CONTAINS_TEXT;
} else if (type == MetadataValueType.BOOLEAN) {
searchOperator = SearchOperator.IS_TRUE;
} else {
searchOperator = SearchOperator.EQUALS;
}
value = endValue = null;
this.metadataCode = metadataCode;
this.metadataType = type;
this.enumClassName = enumClassName;
dirty = true;
}
public SearchOperator getSearchOperator() {
return searchOperator;
}
public void setSearchOperator(SearchOperator searchOperator) {
dirty = true;
this.searchOperator = searchOperator;
}
public Object getValue() {
return value;
}
public void setValue(Object value) {
dirty = true;
this.value = value;
}
public Object getEndValue() {
return endValue;
}
public void setEndValue(Object endValue) {
dirty = true;
this.endValue = endValue;
}
public boolean isLeftParens() {
return leftParens;
}
public void setLeftParens(boolean leftParens) {
dirty = true;
this.leftParens = leftParens;
}
public boolean isRightParens() {
return rightParens;
}
public void setRightParens(boolean rightParens) {
dirty = true;
this.rightParens = rightParens;
}
public BooleanOperator getBooleanOperator() {
return booleanOperator;
}
public void setBooleanOperator(BooleanOperator booleanOperator) {
dirty = true;
this.booleanOperator = booleanOperator;
}
public void setMetadataCode(String metadataCode) {
dirty = true;
this.metadataCode = metadataCode;
}
public MetadataValueType getMetadataType() {
return metadataType;
}
public void setMetadataType(MetadataValueType metadataType) {
dirty = true;
this.metadataType = metadataType;
}
public String getEnumClassName() {
return enumClassName;
}
public void setEnumClassName(String enumClassName) {
dirty = true;
this.enumClassName = enumClassName;
}
public boolean isNotEmpty() {
return metadataCode != null && value != null
|| searchOperator == SearchOperator.IS_FALSE
|| searchOperator == SearchOperator.IS_TRUE
|| searchOperator == SearchOperator.IS_NULL
|| searchOperator == SearchOperator.IS_NOT_NULL
;
}
public String getSchemaCode() {
String[] splittedCode = metadataCode.split("_");
return splittedCode[0] + "_" + splittedCode[1];
}
public RelativeCriteria getRelativeCriteria() {
return relativeCriteria;
}
public void setRelativeCriteria(RelativeCriteria relativeCriteria) {
dirty = true;
this.relativeCriteria = relativeCriteria;
}
// public MeasuringUnitTime getMeasuringUnitTime() {
// return measuringUnitTime;
// }
//
// public void setMeasuringUnitTime(MeasuringUnitTime measuringUnitTime) {
// dirty = true;
// this.measuringUnitTime = measuringUnitTime;
// }
//
// public Object getMeasuringUnitTimeValue() {
// return measuringUnitTimeValue;
// }
//
// public void setMeasuringUnitTimeValue(Object measuringUnitTimeValue) {
// dirty = true;
// this.measuringUnitTimeValue = measuringUnitTimeValue;
// }
// @Override
// public int hashCode() {
// return HashCodeBuilder.reflectionHashCode(this);
// }
//
// @Override
// public boolean equals(Object obj) {
// return EqualsBuilder.reflectionEquals(this, obj);
// }
}