/**
* The contents of this file are subject to the OpenMRS Public License
* Version 1.0 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://license.openmrs.org
*
* Software distributed under the License is distributed on an "AS IS"
* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
* License for the specific language governing rights and limitations
* under the License.
*
* Copyright (C) OpenMRS, LLC. All Rights Reserved.
*/
package org.openmrs.logic;
import java.util.Collection;
import java.util.Date;
import java.util.Map;
import org.hibernate.criterion.Distinct;
import org.openmrs.logic.op.And;
import org.openmrs.logic.op.AsOf;
import org.openmrs.logic.op.Average;
import org.openmrs.logic.op.Count;
import org.openmrs.logic.op.First;
import org.openmrs.logic.op.GreaterThan;
import org.openmrs.logic.op.GreaterThanEquals;
import org.openmrs.logic.op.In;
import org.openmrs.logic.op.Last;
import org.openmrs.logic.op.LessThan;
import org.openmrs.logic.op.LessThanEquals;
import org.openmrs.logic.op.Operand;
import org.openmrs.logic.op.Operator;
import org.openmrs.logic.op.Or;
import org.openmrs.logic.op.TransformOperator;
import org.openmrs.logic.op.Within;
/**
* Used to create a hierarchical representation of a criteria (e.g., similar to a parse tree).
* Criteria can be generated through a series of method calls; each method call returns another
* criteria object containing the prior criteria and the newly added criteria. This class has two
* purposes:
* <ol>
* <li>provide a mechanism for building criteria</li>
* <li>provide a structure that can be passed to the DAO level for analysis & execution</li>
* </ol>
* In its simplest form, a criteria is equivalent to a token — e.g., the following two methods
* should return the same result:
* <ul>
* <li><code>LogicService.eval(myPatient, "CD4 COUNT");</code></li>
* <li><code>LogicService.eval(myPatient, new LogicCriteria("CD4 COUNT"));</code></li>
* </ul>
* However, when criteria or restrictions need to be placed on the token, then a LogicCriteria can
* be used to define these restrictions, e.g.
* <code>new LogicCriteriaImpl("CD4 COUNT").lt(200).within(Duration.months(6))</code>
*/
public interface LogicCriteria {
/**
* Create a new LogicExpression using the <code>operand</code> and <code>operator</code> and
* then append them to the current LogicCriteria
*
* @param operator one of the Operator object to be appended to the current LogicCriteria
* @param operand one of the Operand object
* @return a new LogicCriteria containing the existing and new LogicExpression
*/
public LogicCriteria appendExpression(Operator operator, Operand operand);
/**
* @see LogicCriteria#appendExpression(Operator, Operand)
*/
public LogicCriteria appendExpression(Operator operator, String operand);
/**
* @see LogicCriteria#appendExpression(Operator, Operand)
*/
public LogicCriteria appendExpression(Operator operator, double operand);
/**
* Apply a transformation operator to a logic expression
*
* @param operator type of the {@link TransformOperator}
* @return new logic criteria containing the {@link TransformOperator}
*/
public LogicCriteria applyTransform(Operator operator);
// --Logic Operators joining criteria
/**
* Append a LogicCriteria with another LogicCriteria using an operator
*
* @param operator one type of {@link Operator}
* @param logicCriteria {@link LogicCriteria} to be appended
* @return new {@link LogicCriteria} containing existing and the new {@link LogicCriteria}
*/
public LogicCriteria appendCriteria(Operator operator, LogicCriteria logicCriteria);
/**
* Append the LogicCriteria using the {@link And} operator
*
* @param logicCriteria LogicCriteria to be appended
* @return LogicCriteria that is the combination of existing and the new LogicCriteria
* @see And
*/
public LogicCriteria and(LogicCriteria logicCriteria);
/**
* Append the LogicCriteria using the {@link Or} operator
*
* @param logicCriteria LogicCriteria to be appended
* @return LogicCriteria that is the combination of existing and the new LogicCriteria
* @see Or
*/
public LogicCriteria or(LogicCriteria logicCriteria);
public LogicCriteria not();
//--Transform Operators
/**
* Apply the {@link Count} operator to the LogicCriteria
*
* @return LogicCriteria with count applied
* @see Count
*/
public LogicCriteria count();
/**
* Apply the {@link Average} operator to the LogicCriteria
*
* @return LogicCriteria with Average applied
* @see Average
*/
public LogicCriteria average();
/**
* Apply the {@link Last} operator to the LogicCriteria
*
* @return LogicCriteria with Last applied
* @see Last
*/
public LogicCriteria last();
/**
* @see LogicCriteria#last()
*/
public LogicCriteria last(Integer numResults);
/**
* Apply the {@link First} operator to the LogicCriteria
*
* @return LogicCriteria with First applied
* @see First
*/
public LogicCriteria first();
/**
* @see LogicCriteria#first()
*/
public LogicCriteria first(Integer numResults);
/**
* @see LogicCriteria#first()
*/
public LogicCriteria first(String sortComponent);
/**
* @see LogicCriteria#first()
*/
public LogicCriteria first(Integer numResults, String sortComponent);
/**
* Apply the {@link Distinct} operator to the LogicCriteria
*
* @return LogicCriteria with Distinct operator in it
* @see org.openmrs.logic.op.Distinct
*/
public LogicCriteria distinct();
public LogicCriteria exists();
public LogicCriteria notExists();
//--Comparison Operators
/**
* Add a {@link AsOf} expression to the current LogicCriteria
*
* @param value the operand for the AsOf operator
* @return LogicCriteria with AsOf expression
* @see AsOf
*/
public LogicCriteria asOf(Date value);
/**
* Add a {@link Before} expression to the current LogicCriteria
*
* @param value the operand for the Before operator
* @return LogicCriteria with Before expression
* @see Before
*/
public LogicCriteria before(Date value);
/**
* Add a {@link In} expression to the current LogicCriteria
*
* @param value the operand for the In operator
* @return LogicCriteria with In expression
* @see In
*/
public LogicCriteria after(Date value);
/**
* Add a {@link After} expression to the current LogicCriteria
*
* @param value the operand for the After operator
* @return LogicCriteria with After expression
* @see After
*/
public LogicCriteria in(Collection<?> value);
/**
* @see LogicCriteria#contains(String)
*/
public LogicCriteria contains(Operand value);
/**
* @see LogicCriteria#contains(String)
*/
public LogicCriteria contains(int value);
/**
* @see LogicCriteria#contains(String)
*/
public LogicCriteria contains(float value);
/**
* @see LogicCriteria#contains(String)
*/
public LogicCriteria contains(double value);
/**
* Add a {@link Contains} expression to the current LogicCriteria
*
* @param value the operand for the Contains operator
* @return LogicCriteria with Contains expression
* @see Contains
*/
public LogicCriteria contains(String value);
/**
* @see LogicCriteria#equalTo(String)
*/
public LogicCriteria equalTo(Operand value);
/**
* @see LogicCriteria#equalTo(String)
*/
public LogicCriteria equalTo(int value);
/**
* @see LogicCriteria#equalTo(String)
*/
public LogicCriteria equalTo(float value);
/**
* @see LogicCriteria#equalTo(String)
*/
public LogicCriteria equalTo(double value);
/**
* Add a {@link Equals} expression to the current LogicCriteria
*
* @param value the operand for the Equals operator
* @return LogicCriteria with Equals expression
* @see Equals
*/
public LogicCriteria equalTo(String value);
/**
* @see LogicCriteria#gte(double)
*/
public LogicCriteria gte(Operand value);
/**
* @see LogicCriteria#gte(double)
*/
public LogicCriteria gte(int value);
/**
* @see LogicCriteria#gte(double)
*/
public LogicCriteria gte(float value);
/**
* Add a {@link GreaterThanEquals} expression to the current LogicCriteria
*
* @param value the operand for the GreaterThanEquals operator
* @return LogicCriteria with GreaterThanEquals expression
* @see GreaterThanEquals
*/
public LogicCriteria gte(double value);
/**
* @see LogicCriteria#gt(double)
*/
public LogicCriteria gt(Operand value);
/**
* @see LogicCriteria#gt(double)
*/
public LogicCriteria gt(int value);
/**
* @see LogicCriteria#gt(double)
*/
public LogicCriteria gt(float value);
/**
* Add a {@link GreaterThan} expression to the current LogicCriteria
*
* @param value the operand for the GreaterThan operator
* @return LogicCriteria with GreaterThan expression
* @see GreaterThan
*/
public LogicCriteria gt(double value);
/**
* @see LogicCriteria#lt(double)
*/
public LogicCriteria lt(Operand value);
/**
* @see LogicCriteria#lt(double)
*/
public LogicCriteria lt(int value);
/**
* @see LogicCriteria#lt(double)
*/
public LogicCriteria lt(float value);
/**
* Add a {@link LessThan} expression to the current LogicCriteria
*
* @param value the operand for the LessThan operator
* @return LogicCriteria with LessThan expression
* @see LessThan
*/
public LogicCriteria lt(double value);
/**
* @see LogicCriteria#lte(double)
*/
public LogicCriteria lte(Operand value);
/**
* @see LogicCriteria#lte(double)
*/
public LogicCriteria lte(int value);
/**
* @see LogicCriteria#lte(double)
*/
public LogicCriteria lte(float value);
/**
* Add a {@link LessThanEquals} expression to the current LogicCriteria
*
* @param value the operand for the LessThanEquals operator
* @return LogicCriteria with LessThanEquals expression
* @see LessThanEquals
*/
public LogicCriteria lte(double value);
/**
* Add a duration expression to the current LogicCriteria
*
* @param duration the {@link Duration} object
* @return LogicCriteria containing duration expression
* @see Within
*/
public LogicCriteria within(Duration duration);
/**
* @return
*/
public Map<String, Object> getLogicParameters();
/**
* @param logicParameters
*/
public void setLogicParameters(Map<String, Object> logicParameters);
/**
* Method to get the root token of the current LogicCriteria. <code>
* logicService.parseString("'CD4 COUNT'").getRootToken().equals("CD4 COUNT");
* </code>
*
* @return the root token of the LogicCriteria
*/
public String getRootToken();
/**
* Method to get the LogicExpression backing the current LogicCriteria
*
* @return the LogicExpression of the current LogicCriteria
*/
public LogicExpression getExpression();
}