package org.activityinfo.model.type.expr;
import org.activityinfo.model.form.FormClass;
import org.activityinfo.model.form.FormField;
import org.activityinfo.model.resource.Record;
import org.activityinfo.model.resource.ResourceId;
import org.activityinfo.model.resource.ResourceIdPrefixType;
import org.activityinfo.model.type.*;
/**
* A Value Type that represents a value calculated from a symbolic expression,
* such as "A + B"
*/
public class CalculatedFieldType implements ParametrizedFieldType {
public static final ParametrizedFieldTypeClass TYPE_CLASS = new ParametrizedFieldTypeClass() {
@Override
public String getId() {
return "calculated";
}
@Override
public FieldType createType() {
return new CalculatedFieldType();
}
@Override
public FieldType deserializeType(Record parameters) {
CalculatedFieldType type = new CalculatedFieldType();
Record expr = parameters.isRecord("expression");
if(expr != null) {
type.setExpression(ExprValue.fromRecord(expr));
}
return type;
}
@Override
public FormClass getParameterFormClass() {
FormField exprField = new FormField(ResourceId.valueOf("expression"));
exprField.setLabel("Expression");
exprField.setDescription("Example: A+B+(C/D)+[Volume A]");
exprField.setType(ExprFieldType.INSTANCE);
FormClass formClass = new FormClass(ResourceIdPrefixType.TYPE.id(getId()));
formClass.addElement(exprField);
return formClass;
}
};
private ExprValue expression;
public CalculatedFieldType() {
}
public CalculatedFieldType(String expression) {
this.expression = ExprValue.valueOf(expression);
}
public CalculatedFieldType(ExprValue expression) {
this.expression = expression;
}
public ExprValue getExpression() {
return expression;
}
public void setExpression(String expression) {
this.expression = ExprValue.valueOf(expression);
}
private void setExpression(ExprValue exprValue) {
this.expression = exprValue;
}
@Override
public ParametrizedFieldTypeClass getTypeClass() {
return TYPE_CLASS;
}
@Override
public Record getParameters() {
Record record = new Record();
record.set("classId", getTypeClass().getParameterFormClass().getId());
if(expression != null) {
record.set("expression", expression.asRecord());
}
return record;
}
@Override
public boolean isValid() {
return true;
}
}