ExpressionImpl.java
- /*
- * GovWay - A customizable API Gateway
- * https://govway.org
- *
- * Copyright (c) 2005-2025 Link.it srl (https://link.it).
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 3, as published by
- * the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
- package org.openspcoop2.generic_project.expression.impl;
- import java.util.ArrayList;
- import java.util.Arrays;
- import java.util.Collection;
- import java.util.HashMap;
- import java.util.Iterator;
- import java.util.List;
- import java.util.Map;
- import org.openspcoop2.generic_project.beans.ComplexField;
- import org.openspcoop2.generic_project.beans.ConstantField;
- import org.openspcoop2.generic_project.beans.IField;
- import org.openspcoop2.generic_project.beans.IModel;
- import org.openspcoop2.generic_project.exception.ExpressionException;
- import org.openspcoop2.generic_project.exception.ExpressionNotFoundException;
- import org.openspcoop2.generic_project.exception.ExpressionNotImplementedException;
- import org.openspcoop2.generic_project.expression.IExpression;
- import org.openspcoop2.generic_project.expression.Index;
- import org.openspcoop2.generic_project.expression.LikeMode;
- import org.openspcoop2.generic_project.expression.SortOrder;
- import org.openspcoop2.generic_project.expression.impl.formatter.IObjectFormatter;
- import org.openspcoop2.generic_project.expression.impl.formatter.ObjectFormatter;
- import org.openspcoop2.utils.UtilsRuntimeException;
- import org.openspcoop2.utils.sql.DateTimePartEnum;
- import org.openspcoop2.utils.sql.DayFormatEnum;
- /**
- * ExpressionImpl
- *
- * @author Poli Andrea (apoli@link.it)
- * @author $Author$
- * @version $Rev$, $Date$
- */
- public class ExpressionImpl implements IExpression {
- private static final String FIELD_IS_NULL = "Field is null";
- private static final String FIELD_TYPE_CONSTANT_CANNOT_BE_USED = "The field type 'ConstantField' can not be used with this method";
-
- private boolean throwExpressionNotInitialized = false;
-
- protected IObjectFormatter objectFormatter;
- public IObjectFormatter getObjectFormatter() {
- return this.objectFormatter;
- }
- public void setObjectFormatter(IObjectFormatter objectFormatter) {
- this.objectFormatter = objectFormatter;
- }
-
- public ExpressionImpl() throws ExpressionException {
- this.objectFormatter = new ObjectFormatter();
- }
- public ExpressionImpl(IObjectFormatter objectFormatter) throws ExpressionException{
- if(objectFormatter==null){
- throw new ExpressionException("IObjectFormatter parameter is null");
- }
- this.objectFormatter = objectFormatter;
- }
- public ExpressionImpl(ExpressionImpl expr){
- this.andLogicOperator = expr.andLogicOperator;
- this.expressionEngine = expr.expressionEngine;
- this.notOperator = expr.notOperator;
- this.objectFormatter = expr.objectFormatter;
- this.orderedFields = expr.orderedFields;
- this.sortOrderEngine = expr.getSortOrder();
- this.groupByFields = expr.groupByFields;
- this.throwExpressionNotInitialized = expr.throwExpressionNotInitialized;
- this.forceIndexes = expr.forceIndexes;
- }
-
- protected boolean andLogicOperator = true;
-
- protected AbstractBaseExpressionImpl expressionEngine;
- public AbstractBaseExpressionImpl getExpressionEngine() {
- return this.expressionEngine;
- }
-
- protected boolean notOperator = false;
-
- private SortOrder sortOrderEngine = SortOrder.UNSORTED;
- protected List<OrderedField> orderedFields = new ArrayList<>();
-
- protected List<IField> groupByFields = new ArrayList<>();
-
- protected List<Index> forceIndexes = new ArrayList<>();
-
- protected Map<String, Object> properties = new HashMap<>();
-
-
-
- /* ************ STATE OF EXPRESSION *********** */
-
- /**
- * Make the negation of the expression
- *
- * @return the instance of itself
- * @throws ExpressionNotImplementedException Method not implemented
- * @throws ExpressionException Error Processing
- */
- @Override
- public IExpression not() throws ExpressionNotImplementedException,ExpressionException{
- /**if(this.expressionEngine==null){
- throw new ExpressionException("You can not use the NOT operation on an uninitialized expression");
- }*/
- this.notOperator = true;
- if(this.expressionEngine!=null){
- this.expressionEngine.setNot(true);
- }
- return this;
- }
-
- /**
- * Use the conjunction "AND" for all expressions
- *
- * @return the instance of itself
- * @throws ExpressionNotImplementedException Method not implemented
- * @throws ExpressionException Error Processing
- */
- @Override
- public IExpression and() throws ExpressionNotImplementedException, ExpressionException{
- this.andLogicOperator = true;
- if(this.expressionEngine instanceof ConjunctionExpressionImpl){
- ((ConjunctionExpressionImpl)this.expressionEngine).setAndConjunction(this.andLogicOperator);
- }
- return this;
- }
- /**
- * Use the conjunction "OR" for all expressions
- *
- * @return the instance of itself
- * @throws ExpressionNotImplementedException Method not implemented
- * @throws ExpressionException Error Processing
- */
- @Override
- public IExpression or() throws ExpressionNotImplementedException, ExpressionException{
- this.andLogicOperator = false;
- if(this.expressionEngine instanceof ConjunctionExpressionImpl){
- ((ConjunctionExpressionImpl)this.expressionEngine).setAndConjunction(this.andLogicOperator);
- }
- return this;
- }
-
-
-
-
- /* ************ COMPARATOR *********** */
-
-
- // Serve nella implementazione sql per poter correggere alcuni comparator dipendenti da database
- protected Comparator getCorrectComparator(Comparator comparator){
- return comparator;
- }
-
- /**
- * Create an expression of equality
- * Example: (field = value)
- *
- * @param field Resource identifier
- * @param value Value
- * @return Expression that represents the constraint
- * @throws ExpressionNotImplementedException,ExpressionException
- */
- @Override
- public IExpression equals(IField field, Object value)
- throws ExpressionNotImplementedException, ExpressionException {
- checkArgoments(field, value);
- this.buildComparatorExpression(field, value, getCorrectComparator(Comparator.EQUALS));
- return this;
- }
-
- /**
- * Create an expression of inequality
- * Example: (field <> value)
- *
- * @param field Resource identifier
- * @param value Value
- * @return the instance of itself enriched with expression that represents the constraint
- * @throws ExpressionNotImplementedException,ExpressionException
- */
- @Override
- public IExpression notEquals(IField field, Object value)
- throws ExpressionNotImplementedException, ExpressionException {
- checkArgoments(field, value);
- this.buildComparatorExpression(field, value, getCorrectComparator(Comparator.NOT_EQUALS));
- return this;
- }
- /**
- * Create an expression of equality to each resource in the collection of the keys of the Map
- * Use the conjunction "AND" for all expressions
- * Example: ( field[0]=values[0] AND field[1]=values[1] ..... AND field[N]=values[N] )
- *
- * @param propertyNameValues Map that contains identifiers and their values
- * @return the instance of itself enriched with expression that represents the constraint
- * @throws ExpressionNotImplementedException,ExpressionException
- */
- @Override
- public IExpression allEquals(Map<IField, Object> propertyNameValues)
- throws ExpressionNotImplementedException, ExpressionException {
- checkArgoments(propertyNameValues);
- buildComparatorExpression(propertyNameValues, getCorrectComparator(Comparator.EQUALS), true);
- return this;
- }
- /**
- * Create an expression of inequality to each resource in the collection of the keys of the Map
- * Use the conjunction "AND" for all expressions
- * Example: ( field[0]<>values[0] AND field[1]<>values[1] ..... AND field[N]<>values[N] )
- *
- * @param propertyNameValues Map that contains identifiers and their values
- * @return the instance of itself enriched with expression that represents the constraint
- * @throws ExpressionNotImplementedException,ExpressionException
- */
- @Override
- public IExpression allNotEquals(Map<IField, Object> propertyNameValues)
- throws ExpressionNotImplementedException, ExpressionException {
- checkArgoments(propertyNameValues);
- buildComparatorExpression(propertyNameValues, getCorrectComparator(Comparator.NOT_EQUALS), true);
- return this;
- }
- /**
- * Create an expression of equality to each resource in the collection of the keys of the Map
- * Use the conjunction defined by <var>andConjunction</var> for all expressions
- * Example: ( field[0]=values[0] <var>andConjunction</var> field[1]=values[1] ..... <var>andConjunction</var> field[N]=values[N] )
- *
- * @param propertyNameValues Map that contains identifiers and their values
- * @return the instance of itself enriched with expression that represents the constraint
- * @throws ExpressionNotImplementedException,ExpressionException
- */
- @Override
- public IExpression allEquals(Map<IField, Object> propertyNameValues,boolean andConjunction)
- throws ExpressionNotImplementedException, ExpressionException {
- checkArgoments(propertyNameValues);
- buildComparatorExpression(propertyNameValues, getCorrectComparator(Comparator.EQUALS), andConjunction);
- return this;
- }
- /**
- * Create an expression of inequality to each resource in the collection of the keys of the Map
- * Use the conjunction defined by <var>andConjunction</var> for all expressions
- * Example: ( field[0]<>values[0] <var>andConjunction</var> field[1]<>values[1] ..... <var>andConjunction</var> field[N]<>values[N] )
- *
- * @param propertyNameValues Map that contains identifiers and their values
- * @return the instance of itself enriched with expression that represents the constraint
- * @throws ExpressionNotImplementedException,ExpressionException
- */
- @Override
- public IExpression allNotEquals(Map<IField, Object> propertyNameValues,boolean andConjunction)
- throws ExpressionNotImplementedException, ExpressionException {
- checkArgoments(propertyNameValues);
- buildComparatorExpression(propertyNameValues, getCorrectComparator(Comparator.NOT_EQUALS), andConjunction);
- return this;
- }
-
- /**
- * Create an expression "greaterThan"
- * Example: (field > value)
- *
- * @param field Resource identifier
- * @param value Value
- * @return the instance of itself enriched with expression that represents the constraint
- * @throws ExpressionNotImplementedException,ExpressionException
- */
- @Override
- public IExpression greaterThan(IField field, Object value)
- throws ExpressionNotImplementedException, ExpressionException {
- checkArgoments(field, value);
- this.buildComparatorExpression(field, value, getCorrectComparator(Comparator.GREATER_THAN));
- return this;
- }
- /**
- * Create an expression "greaterEquals"
- * Example: (field >= value)
- *
- * @param field Resource identifier
- * @param value Value
- * @return the instance of itself enriched with expression that represents the constraint
- * @throws ExpressionNotImplementedException,ExpressionException
- */
- @Override
- public IExpression greaterEquals(IField field, Object value)
- throws ExpressionNotImplementedException, ExpressionException {
- checkArgoments(field, value);
- this.buildComparatorExpression(field, value, getCorrectComparator(Comparator.GREATER_EQUALS));
- return this;
- }
- /**
- * Create an expression "lessThan"
- * Example: (field < value)
- *
- * @param field Resource identifier
- * @param value Value
- * @return the instance of itself enriched with expression that represents the constraint
- * @throws ExpressionNotImplementedException,ExpressionException
- */
- @Override
- public IExpression lessThan(IField field, Object value)
- throws ExpressionNotImplementedException, ExpressionException {
- checkArgoments(field, value);
- this.buildComparatorExpression(field, value, getCorrectComparator(Comparator.LESS_THAN));
- return this;
- }
- /**
- * Create an expression "lessEquals"
- * Example: (field <= value)
- *
- * @param field Resource identifier
- * @param value Value
- * @return the instance of itself enriched with expression that represents the constraint
- * @throws ExpressionNotImplementedException,ExpressionException
- */
- @Override
- public IExpression lessEquals(IField field, Object value)
- throws ExpressionNotImplementedException, ExpressionException {
- checkArgoments(field, value);
- this.buildComparatorExpression(field, value, getCorrectComparator(Comparator.LESS_EQUALS));
- return this;
- }
-
-
-
- /* ************ SPECIAL COMPARATOR *********** */
-
- /**
- * Create an expression "is null"
- * Example: ( field is null )
- *
- * @param field Resource identifier
- * @return the instance of itself enriched with expression that represents the constraint
- * @throws ExpressionNotImplementedException,ExpressionException
- */
- @Override
- public IExpression isNull(IField field) throws ExpressionNotImplementedException,ExpressionException{
- checkArgoments(field,false);
- this.buildComparatorExpression(field, null, getCorrectComparator(Comparator.IS_NULL));
- return this;
- }
-
- /**
- * Create an expression "is not null"
- * Example: ( field is not null )
- *
- * @param field Resource identifier
- * @return the instance of itself enriched with expression that represents the constraint
- * @throws ExpressionNotImplementedException,ExpressionException
- */
- @Override
- public IExpression isNotNull(IField field) throws ExpressionNotImplementedException,ExpressionException{
- checkArgoments(field,false);
- this.buildComparatorExpression(field, null, getCorrectComparator(Comparator.IS_NOT_NULL));
- return this;
- }
-
- /**
- * Create an expression "is empty"
- * Example: ( field = '' )
- *
- * @param field Resource identifier
- * @return the instance of itself enriched with expression that represents the constraint
- * @throws ExpressionNotImplementedException,ExpressionException
- */
- @Override
- public IExpression isEmpty(IField field) throws ExpressionNotImplementedException,ExpressionException{
- checkArgoments(field,false);
- this.buildComparatorExpression(field, null, getCorrectComparator(Comparator.IS_EMPTY));
- return this;
- }
- /**
- * Create an expression "is not empty"
- * Example: ( field <> '' )
- *
- * @param field Resource identifier
- * @return the instance of itself enriched with expression that represents the constraint
- * @throws ExpressionNotImplementedException,ExpressionException
- */
- @Override
- public IExpression isNotEmpty(IField field) throws ExpressionNotImplementedException,ExpressionException{
- checkArgoments(field,false);
- this.buildComparatorExpression(field, null, getCorrectComparator(Comparator.IS_NOT_EMPTY));
- return this;
- }
-
-
-
-
- /* ************ BETWEEN *********** */
-
- /**
- * Create an expression "between"
- * Example: ( field BEETWEEN lower AND high )
- *
- * @param field Resource identifier
- * @param lower Lower limit value to be applied to the constraint
- * @param high Higher limit value to be applied to the constraint
- * @return the instance of itself enriched with expression that represents the constraint
- * @throws ExpressionNotImplementedException,ExpressionException
- */
- @Override
- public IExpression between(IField field, Object lower, Object high)
- throws ExpressionNotImplementedException, ExpressionException {
- checkArgoments(field, lower, high);
- buildBeetweenExpression(field, lower, high);
- return this;
- }
-
-
-
- /* ************ LIKE *********** */
-
- /**
- * Create an expression "like"
- * Example: ( field like '%value%' )
- *
- * @param field Resource identifier
- * @param value Value
- * @return the instance of itself enriched with expression that represents the constraint
- * @throws ExpressionNotImplementedException,ExpressionException
- */
- @Override
- public IExpression like(IField field, String value)
- throws ExpressionNotImplementedException, ExpressionException {
- checkArgoments(field, value);
- buildLikeExpression(field, value, LikeMode.ANYWHERE, false);
- return this;
- }
- /**
- * Create an expression "like"
- * Example:
- * LikeMode.ANYWHERE -> ( field like '%value%' )
- * LikeMode.EXACT -> ( field like 'value' )
- * LikeMode.END -> ( field like '%value' )
- * LikeMode.START -> ( field like 'value%' )
- *
- * @param field Resource identifier
- * @param value Value
- * @param mode LikeMode
- * @return the instance of itself enriched with expression that represents the constraint
- * @throws ExpressionNotImplementedException,ExpressionException
- */
- @Override
- public IExpression like(IField field, String value, LikeMode mode)
- throws ExpressionNotImplementedException, ExpressionException {
- checkArgoments(field, value);
- buildLikeExpression(field, value, mode, false);
- return this;
- }
- /**
- * Create an expression "like" case-insensitive
- * Example: ( toLower(field) like '%toLower(value)%' )
- *
- * @param field Resource identifier
- * @param value Value
- * @return the instance of itself enriched with expression that represents the constraint
- * @throws ExpressionNotImplementedException,ExpressionException
- */
- @Override
- public IExpression ilike(IField field, String value)
- throws ExpressionNotImplementedException, ExpressionException {
- checkArgoments(field, value);
- buildLikeExpression(field, value, LikeMode.ANYWHERE, true);
- return this;
- }
- /**
- * Create an expression "like" case-insensitive
- * Example:
- * LikeMode.ANYWHERE -> ( toLower(field) like '%toLower(value)%' )
- * LikeMode.EXACT -> ( toLower(field) like 'toLower(value)' )
- * LikeMode.END -> ( toLower(field) like '%toLower(value)' )
- * LikeMode.START -> ( toLower(field) like 'toLower(value)%' )
- *
- * @param field Resource identifier
- * @param value Value
- * @param mode LikeMode
- * @return the instance of itself enriched with expression that represents the constraint
- * @throws ExpressionNotImplementedException,ExpressionException
- */
- @Override
- public IExpression ilike(IField field, String value, LikeMode mode)
- throws ExpressionNotImplementedException, ExpressionException {
- checkArgoments(field, value);
- buildLikeExpression(field, value, mode, true);
- return this;
- }
-
-
-
- /* ************ DATE PART *********** */
-
- /**
- * Create an expression che verifica l'anno di una data
- * Example: ( EXTRACT(YEAR FROM field) = 'value' )
- *
- * @param field Resource identifier
- * @param value Value
- * @return the instance of itself enriched with expression that represents the constraint
- * @throws ExpressionNotImplementedException,ExpressionException
- */
- @Override
- public IExpression isYear(IField field, int value) throws ExpressionNotImplementedException,ExpressionException{
- checkArgoments(field, value);
- buildDateTimePartExpression(field, value+"", DateTimePartEnum.YEAR);
- return this;
- }
- @Override
- public IExpression isYear(IField field, String value) throws ExpressionNotImplementedException,ExpressionException{
- checkArgoments(field, value);
- buildDateTimePartExpression(field, value, DateTimePartEnum.YEAR);
- return this;
- }
-
- /**
- * Create an expression che verifica il mese (numerico) di una data
- * Example: ( EXTRACT(MONTH FROM field) = 'value' )
- *
- * @param field Resource identifier
- * @param value Value
- * @return the instance of itself enriched with expression that represents the constraint
- * @throws ExpressionNotImplementedException,ExpressionException
- */
- @Override
- public IExpression isMonth(IField field, int value) throws ExpressionNotImplementedException,ExpressionException{
- checkArgoments(field, value);
- buildDateTimePartExpression(field, value+"", DateTimePartEnum.MONTH);
- return this;
- }
- @Override
- public IExpression isMonth(IField field, String value) throws ExpressionNotImplementedException,ExpressionException{
- checkArgoments(field, value);
- buildDateTimePartExpression(field, value, DateTimePartEnum.MONTH);
- return this;
- }
-
- /**
- * Create an expression che verifica il giorno del mese di una data
- * Example: ( EXTRACT(DAY FROM field) = 'value' )
- *
- * @param field Resource identifier
- * @param value Value
- * @return the instance of itself enriched with expression that represents the constraint
- * @throws ExpressionNotImplementedException,ExpressionException
- */
- @Override
- public IExpression isDayOfMonth(IField field, int value) throws ExpressionNotImplementedException,ExpressionException{
- checkArgoments(field, value);
- buildDateTimePartExpression(field, value+"", DateTimePartEnum.DAY);
- return this;
- }
- @Override
- public IExpression isDayOfMonth(IField field, String value) throws ExpressionNotImplementedException,ExpressionException{
- checkArgoments(field, value);
- buildDateTimePartExpression(field, value, DateTimePartEnum.DAY);
- return this;
- }
-
- /**
- * Create an expression che verifica il giorno dell'anno di una data
- * Example: ( TO_CHAR(data_ingresso_richiesta, 'DDD') = 'value' )
- *
- * @param field Resource identifier
- * @param value Value
- * @return the instance of itself enriched with expression that represents the constraint
- * @throws ExpressionNotImplementedException,ExpressionException
- */
- @Override
- public IExpression isDayOfYear(IField field, int value) throws ExpressionNotImplementedException,ExpressionException{
- checkArgoments(field, value);
- buildDayFormatExpression(field, value+"", DayFormatEnum.DAY_OF_YEAR);
- return this;
- }
- @Override
- public IExpression isDayOfYear(IField field, String value) throws ExpressionNotImplementedException,ExpressionException{
- checkArgoments(field, value);
- buildDayFormatExpression(field, value, DayFormatEnum.DAY_OF_YEAR);
- return this;
- }
-
- /**
- * Create an expression che verifica il giorno della settimana di una data
- * Example: ( TO_CHAR(data_ingresso_richiesta, 'D') = 'value' )
- *
- * @param field Resource identifier
- * @param value Value
- * @return the instance of itself enriched with expression that represents the constraint
- * @throws ExpressionNotImplementedException,ExpressionException
- */
- @Override
- public IExpression isDayOfWeek(IField field, int value) throws ExpressionNotImplementedException,ExpressionException{
- checkArgoments(field, value);
- buildDayFormatExpression(field, value+"", DayFormatEnum.DAY_OF_WEEK);
- return this;
- }
- @Override
- public IExpression isDayOfWeek(IField field, String value) throws ExpressionNotImplementedException,ExpressionException{
- checkArgoments(field, value);
- buildDayFormatExpression(field, value, DayFormatEnum.DAY_OF_WEEK);
- return this;
- }
-
- /**
- * Create an expression che verifica l'ora di una data
- * Example: ( EXTRACT(HOUR FROM field) = 'value' )
- *
- * @param field Resource identifier
- * @param value Value
- * @return the instance of itself enriched with expression that represents the constraint
- * @throws ExpressionNotImplementedException,ExpressionException
- */
- @Override
- public IExpression isHour(IField field, int value) throws ExpressionNotImplementedException,ExpressionException{
- checkArgoments(field, value);
- buildDateTimePartExpression(field, value+"", DateTimePartEnum.HOUR);
- return this;
- }
- @Override
- public IExpression isHour(IField field, String value) throws ExpressionNotImplementedException,ExpressionException{
- checkArgoments(field, value);
- buildDateTimePartExpression(field, value, DateTimePartEnum.HOUR);
- return this;
- }
-
- /**
- * Create an expression che verifica i minuti di una data
- * Example: ( EXTRACT(MINUTE FROM field) = 'value' )
- *
- * @param field Resource identifier
- * @param value Value
- * @return the instance of itself enriched with expression that represents the constraint
- * @throws ExpressionNotImplementedException,ExpressionException
- */
- @Override
- public IExpression isMinute(IField field, int value) throws ExpressionNotImplementedException,ExpressionException{
- checkArgoments(field, value);
- buildDateTimePartExpression(field, value+"", DateTimePartEnum.MINUTE);
- return this;
- }
- @Override
- public IExpression isMinute(IField field, String value) throws ExpressionNotImplementedException,ExpressionException{
- checkArgoments(field, value);
- buildDateTimePartExpression(field, value, DateTimePartEnum.MINUTE);
- return this;
- }
-
- /**
- * Create an expression che verifica i secondi di una data
- * Example: ( EXTRACT(SECOND FROM field) = 'value' )
- *
- * @param field Resource identifier
- * @param value Value
- * @return the instance of itself enriched with expression that represents the constraint
- * @throws ExpressionNotImplementedException,ExpressionException
- */
- @Override
- public IExpression isSecond(IField field, int value) throws ExpressionNotImplementedException,ExpressionException{
- checkArgoments(field, value);
- buildDateTimePartExpression(field, value+"", DateTimePartEnum.SECOND);
- return this;
- }
- @Override
- public IExpression isSecond(IField field, double value) throws ExpressionNotImplementedException,ExpressionException{
- checkArgoments(field, value);
- buildDateTimePartExpression(field, value+"", DateTimePartEnum.SECOND);
- return this;
- }
- @Override
- public IExpression isSecond(IField field, String value) throws ExpressionNotImplementedException,ExpressionException{
- checkArgoments(field, value);
- buildDateTimePartExpression(field, value, DateTimePartEnum.SECOND);
- return this;
- }
-
- /**
- * Create an expression che verifica il giorno di una data, nel formato umano (es. Friday)
- * Example: ( TO_CHAR(data_ingresso_richiesta, 'DAY') = 'value' )
- *
- * @param field Resource identifier
- * @param value Value
- * @return the instance of itself enriched with expression that represents the constraint
- * @throws ExpressionNotImplementedException,ExpressionException
- */
- @Override
- public IExpression isFullDayName(IField field, String value) throws ExpressionNotImplementedException,ExpressionException{
- checkArgoments(field, value);
- buildDayFormatExpression(field, value, DayFormatEnum.FULL_DAY_NAME);
- return this;
- }
-
- /**
- * Create an expression che verifica il giorno di una data, nel formato compatto umano (es. Fri)
- * Example: ( TO_CHAR(data_ingresso_richiesta, 'DY') = 'value' )
- *
- * @param field Resource identifier
- * @param value Value
- * @return the instance of itself enriched with expression that represents the constraint
- * @throws ExpressionNotImplementedException,ExpressionException
- */
- @Override
- public IExpression isShortDayName(IField field, String value) throws ExpressionNotImplementedException,ExpressionException{
- checkArgoments(field, value);
- buildDayFormatExpression(field, value, DayFormatEnum.SHORT_DAY_NAME);
- return this;
- }
-
-
-
-
-
- /* ************ IN *********** */
-
- /**
- * Create an expression "in" verifying that the value of <var>field</var> is one of those given in the param <var>values</var>
- * Example: ( field IN ('values[0]', 'values[1]', ... ,'values[n]') )
- *
- * @param field Resource identifier
- * @param values Values
- * @return the instance of itself enriched with expression that represents the constraint
- * @throws ExpressionNotImplementedException,ExpressionException
- */
- @Override
- public IExpression in(IField field, Object... values)
- throws ExpressionNotImplementedException, ExpressionException {
- checkArgoments(field, values);
- buildInExpression(field, values);
- return this;
- }
- /**
- * Create an expression "in" verifying that the value of <var>field</var> is one of those given in the param <var>values</var>
- * Example: ( field IN ('values[0]', 'values[1]', ... ,'values[n]') )
- *
- * @param field Resource identifier
- * @param values Values
- * @return the instance of itself enriched with expression that represents the constraint
- * @throws ExpressionNotImplementedException,ExpressionException
- */
- @Override
- public IExpression in(IField field, Collection<?> values)
- throws ExpressionNotImplementedException, ExpressionException {
- if(values==null){
- throw new ExpressionException("Values is null");
- }
- checkArgoments(field, values.toArray(new Object[1]));
- buildInExpression(field, values.toArray(new Object[1]));
- return this;
- }
-
-
-
- /* ************ CONJUNCTION *********** */
-
- /**
- * Adds to the expression in the conjunction "AND" of the espressions given as a parameters
- * Example: ( exp1 AND exp2 )
- *
- * @param exp1 Filter combined in AND with <var>exp1</var>
- * @param exp2 Filter combined in AND with <var>exp2</var>
- * @return the instance of itself enriched with expression that represents the constraint
- * @throws ExpressionNotImplementedException,ExpressionException
- */
- @Override
- public IExpression and(IExpression exp1, IExpression exp2)
- throws ExpressionNotImplementedException, ExpressionException {
- IExpression [] expr = new IExpression[2];
- expr[0] = exp1;
- expr[1] = exp2;
- return this.and(expr);
- }
- /**
- * Adds to the expression in the conjunction "AND" of the espressions given as a parameters
- * Example: ( expressions[1] AND expressions[2] AND ... expressions[N] )
- *
- * @param expressions Expressions combined in AND
- * @return the instance of itself enriched with expression that represents the constraint
- * @throws ExpressionNotImplementedException,ExpressionException
- */
- @Override
- public IExpression and(IExpression... expressions)
- throws ExpressionNotImplementedException, ExpressionException {
- checkConjunctionOperation(expressions);
- buildConjunctionExpression(true, expressions);
- return this;
- }
- /**
- * Adds to the expression in the conjunction "OR" of the espressions given as a parameters
- * Example: ( exp1 OR exp2 )
- *
- * @param exp1 Filter combined in OR with <var>exp1</var>
- * @param exp2 Filter combined in OR with <var>exp2</var>
- * @return the instance of itself enriched with expression that represents the constraint
- * @throws ExpressionNotImplementedException,ExpressionException
- */
- @Override
- public IExpression or(IExpression exp1, IExpression exp2)
- throws ExpressionNotImplementedException, ExpressionException {
- IExpression [] expr = new IExpression[2];
- expr[0] = exp1;
- expr[1] = exp2;
- return this.or(expr);
- }
- /**
- * Adds to the expression in the conjunction "OR" of the espressions given as a parameters
- * Example: ( expressions[1] OR expressions[2] OR ... expressions[N] )
- *
- * @param expressions Expressions combined in OR
- * @return the instance of itself enriched with expression that represents the constraint
- * @throws ExpressionNotImplementedException,ExpressionException
- */
- @Override
- public IExpression or(IExpression... expressions)
- throws ExpressionNotImplementedException, ExpressionException {
- checkConjunctionOperation(expressions);
- buildConjunctionExpression(false, expressions);
- return this;
- }
-
-
-
- /* ************ NEGATION *********** */
-
- /**
- * Adding to the negation of the expression passed as parameter
- * Example: ( NOT expression )
- *
- * @param expression Expression
- * @return the instance of itself enriched with expression that represents the constraint
- * @throws ExpressionNotImplementedException,ExpressionException
- */
- @Override
- public IExpression not(IExpression expression)
- throws ExpressionNotImplementedException, ExpressionException {
- if(! (expression instanceof ExpressionImpl) ){
- throw new ExpressionException("Expression has wrong type expect: "+ExpressionImpl.class.getName()+" found: "+expression.getClass().getName());
- }
- buildNotExpression(((ExpressionImpl)expression).expressionEngine);
- return this;
- }
-
-
-
-
-
-
- /* ************ ORDER *********** */
-
- /**
- * Sets the sort of research
- *
- * @param sortOrder sort of research
- * @return the instance of itself
- * @throws ExpressionNotImplementedException Method not implemented
- * @throws ExpressionException Error Processing
- */
- @Override
- public IExpression sortOrder(SortOrder sortOrder)
- throws ExpressionNotImplementedException, ExpressionException {
- this.sortOrderEngine = sortOrder;
- return this;
- }
- /**
- * Adds a sort field order
- *
- * @param field sort field order
- * @return the instance of itself
- * @throws ExpressionNotImplementedException Method not implemented
- * @throws ExpressionException Error Processing
- */
- @Override
- public IExpression addOrder(IField field)
- throws ExpressionNotImplementedException, ExpressionException {
- this.checkArgoments(field,false);
- if(this.sortOrderEngine==null || SortOrder.UNSORTED.equals(this.sortOrderEngine)){
- throw new ExpressionException("To add order by conditions must first be defined the sort order (by sortOrder method)");
- }
- this.orderedFields.add(new OrderedField(field, this.sortOrderEngine));
- return this;
- }
-
- /**
- * Adds a sort field order
- *
- * @param field sort field order
- * @param sortOrder sort of research
- * @return the instance of itself
- * @throws ExpressionNotImplementedException Method not implemented
- * @throws ExpressionException Error Processing
- */
- @Override
- public IExpression addOrder(IField field, SortOrder sortOrder) throws ExpressionNotImplementedException,ExpressionException{
- this.checkArgoments(field,false);
- if(sortOrder==null){
- throw new ExpressionException("Sort order parameter undefined");
- }
- if(SortOrder.UNSORTED.equals(sortOrder)){
- throw new ExpressionException("Sort order parameter not valid (use ASC or DESC)");
- }
- this.orderedFields.add(new OrderedField(field, sortOrder));
- return this;
- }
-
- public List<OrderedField> getOrderedFields() {
- return this.orderedFields;
- }
-
- public SortOrder getSortOrder(){
- if(
- ( this.sortOrderEngine==null || SortOrder.UNSORTED.equals(this.sortOrderEngine) )
- &&
- ( this.orderedFields!=null && !this.orderedFields.isEmpty() )
- ){
- // ritorno un sortOrder a caso tra i orderedFields, tanto poi viene usato sempre quello indicato per ogni field.
- return this.orderedFields.get(0).getSortOrder();
- }
- return this.sortOrderEngine;
- }
-
-
-
-
-
-
- /* ************ GROUP BY *********** */
-
- @Override
- public IExpression addGroupBy(IField field)
- throws ExpressionNotImplementedException, ExpressionException {
- this.checkArgoments(field,false);
- this.groupByFields.add(field);
- return this;
- }
-
- public List<IField> getGroupByFields() {
- return this.groupByFields;
- }
-
-
-
-
-
-
-
-
-
- /* ************ IN USE MODEL/FIELD EXPRESSION *********** */
-
- /**
- * Return the information as the <var>field</var> is used in the expression
- *
- * @param field field test
- * @return information as the <var>field</var> is used in the expression
- */
- @Override
- public boolean inUseField(IField field,boolean checkOnlyWhereCondition) throws ExpressionNotImplementedException, ExpressionException {
- if(this.expressionEngine==null &&
- checkOnlyWhereCondition) {
- return false;
- }
- if( this.expressionEngine!=null && this.expressionEngine.inUseField(field) ){
- return true;
- }
- if(!checkOnlyWhereCondition){
- boolean check = checkUseField(field);
- if(check) {
- return true;
- }
- }
- return false;
- }
- private boolean checkUseField(IField field) {
- if(this.orderedFields!=null){
- for (int i = 0; i < this.orderedFields.size(); i++) {
- if(field.equals(this.orderedFields.get(i).getField())){
- return true;
- }
- }
- }
- if(this.groupByFields!=null){
- for (int i = 0; i < this.groupByFields.size(); i++) {
- if(field.equals(this.groupByFields.get(i))){
- return true;
- }
- }
- }
- return false;
- }
-
- /**
- * Return the information as there are few fields in the expression belonging to the <var>model</var>
- *
- * @param model model test
- * @return information as there are few fields in the expression belonging to the <var>model</var>
- */
- @Override
- public boolean inUseModel(IModel<?> model,boolean checkOnlyWhereCondition) throws ExpressionNotImplementedException, ExpressionException {
- if(this.expressionEngine==null &&
- checkOnlyWhereCondition) {
- return false;
- }
- if( this.expressionEngine!=null && this.expressionEngine.inUseModel(model) ){
- return true;
- }
- if(!checkOnlyWhereCondition){
- if(this.orderedFields!=null){
- for (int i = 0; i < this.orderedFields.size(); i++) {
- IField field = this.orderedFields.get(i).getField();
- boolean inUseModel = false;
- if(model.getBaseField()!=null){
- // Modello di un elemento non radice
- if(field instanceof ComplexField){
- ComplexField c = (ComplexField) field;
- inUseModel = c.getFather().equals(model.getBaseField());
- }else{
- String modeClassName = model.getModeledClass().getName() + "";
- inUseModel = modeClassName.equals(field.getClassType().getName());
- }
- }
- else{
- String modeClassName = model.getModeledClass().getName() + "";
- inUseModel = modeClassName.equals(field.getClassType().getName());
- }
- if(inUseModel){
- return true;
- }
- }
- }
- if(this.groupByFields!=null){
- for (int i = 0; i < this.groupByFields.size(); i++) {
- IField field = this.groupByFields.get(i);
- boolean inUseModel = false;
- if(model.getBaseField()!=null){
- // Modello di un elemento non radice
- if(field instanceof ComplexField){
- ComplexField c = (ComplexField) field;
- inUseModel = c.getFather().equals(model.getBaseField());
- }else{
- String modeClassName = model.getModeledClass().getName() + "";
- inUseModel = modeClassName.equals(field.getClassType().getName());
- }
- }
- else{
- String modeClassName = model.getModeledClass().getName() + "";
- inUseModel = modeClassName.equals(field.getClassType().getName());
- }
- if(inUseModel){
- return true;
- }
- }
- }
- }
- return false;
- }
-
-
-
-
-
-
-
-
-
-
- /* ************ GET FIELDS INTO EXPRESSION *********** */
-
- /**
- * Return the fields userd in the expression
- *
- * @return Return the fields userd in the expression
- * @throws ExpressionNotImplementedException
- * @throws ExpressionException
- */
- @Override
- public List<IField> getFields(boolean onlyWhereCondition) throws ExpressionNotImplementedException, ExpressionException{
- List<IField> o = this.expressionEngine!=null ? this.expressionEngine.getFields() : null;
- if(!onlyWhereCondition){
- o = addFieldByOrderBy(o);
- o = addFieldByGroupBy(o);
- }
- return o;
- }
- private List<IField> addFieldByOrderBy(List<IField> o) {
- if(this.orderedFields!=null){
- for (int i = 0; i < this.orderedFields.size(); i++) {
- IField field = this.orderedFields.get(i).getField();
- if(o==null){
- o = new ArrayList<>();
- }
- if(!o.contains(field)){
- o.add(field);
- }
- }
- }
- return o;
- }
- private List<IField> addFieldByGroupBy(List<IField> o) {
- if(this.groupByFields!=null){
- for (int i = 0; i < this.groupByFields.size(); i++) {
- IField field = this.groupByFields.get(i);
- if(o==null){
- o = new ArrayList<>();
- }
- if(!o.contains(field)){
- o.add(field);
- }
- }
- }
- return o;
- }
-
- /**
- * Return the object associated with the <var>field</var> present in the expression
- *
- * @param field field test
- * @return the object associated with the <var>field</var> present in the expression
- */
- @Override
- public List<Object> getWhereConditionFieldValues(IField field) throws ExpressionNotImplementedException, ExpressionNotFoundException, ExpressionException{
- if(this.expressionEngine==null){
- throw new ExpressionNotFoundException("Field is not used in expression (Expression is empty)");
- }
- if(!this.inUseField(field,true)){
- throw new ExpressionNotFoundException("Field is not used in expression ["+field.toString()+"]");
- }
- List<Object> o = this.expressionEngine.getFieldValues(field);
- if(o==null){
- // non dovrei mai entrarci
- throw new ExpressionNotFoundException("Field is not used in expression ["+field.toString()+"] (null??)");
- }
- return o;
- }
-
-
-
-
-
-
-
- /* ************ EXPRESSION STATE *********** */
-
- /**
- * Return an indication if the expression contains 'where conditions'
- *
- * @return indication if the expression contains 'where conditions'
- * @throws ExpressionNotImplementedException Method not implemented
- * @throws ExpressionException Error Processing
- */
- @Override
- public boolean isWhereConditionsPresent() throws ExpressionNotImplementedException, ExpressionException{
- return this.expressionEngine==null;
- }
-
-
-
-
-
- /* ************ INDEX *********** */
-
- /**
- * Force use index
- *
- * @param index index
- * @return the instance of itself
- * @throws ExpressionNotImplementedException Method not implemented
- * @throws ExpressionException Error Processing
- */
- @Override
- public IExpression addForceIndex(Index index) throws ExpressionNotImplementedException,ExpressionException{
- this.forceIndexes.add(index);
- return this;
- }
-
- /**
- * Return the force indexes
- *
- * @return list force indexes
- * @throws ExpressionNotImplementedException Method not implemented
- * @throws ExpressionException Error Processing
- */
- public List<Index> getForceIndexes() {
- return this.forceIndexes;
- }
-
-
-
-
- /* ************ PROPERTY *********** */
-
- @Override
- public void addProperty(String name, Object value) {
- this.properties.put(name, value);
- }
- @Override
- public Object getProperty(String name) {
- return this.properties.get(name);
- }
-
-
-
-
- /* ************ TO STRING *********** */
-
- @Override
- public String toString(){
- return this.toString(true);
- }
- protected String toString(boolean printForceIndex){
- String s = super.toString();
- if(s==null){
- return s;
- }
- else{
-
- if(this.throwExpressionNotInitialized){
- throw new UtilsRuntimeException("Expression is not initialized");
- }
-
- StringBuilder bf = new StringBuilder();
- if(this.expressionEngine==null){
- bf.append("");
- }else{
- bf.append(this.expressionEngine.toString());
- }
-
-
- if(!this.groupByFields.isEmpty()){
-
- bf.append(" GROUP BY ");
-
- int index = 0;
- for (Iterator<IField> iterator = this.groupByFields.iterator(); iterator.hasNext();) {
- IField field = iterator.next();
- if(index>0){
- bf.append(" , ");
- }
- if(field instanceof ComplexField){
- ComplexField cf = (ComplexField) field;
- if(cf.getFather()!=null){
- bf.append(cf.getFather().getFieldName());
- }else{
- bf.append(field.getClassName());
- }
- }else{
- bf.append(field.getClassName());
- }
- bf.append(".");
- bf.append(field.getFieldName());
- index++;
- }
- }
-
-
- if(!SortOrder.UNSORTED.equals(this.getSortOrder())){
-
- bf.append(" ORDER BY ");
- if(!this.orderedFields.isEmpty()){
- int index = 0;
- for (Iterator<OrderedField> iterator = this.orderedFields.iterator(); iterator.hasNext();) {
- OrderedField orderedField = iterator.next();
- if(index>0){
- bf.append(" , ");
- }
- IField field = orderedField.getField();
- if(field instanceof ComplexField){
- ComplexField cf = (ComplexField) field;
- if(cf.getFather()!=null){
- bf.append(cf.getFather().getFieldName());
- }else{
- bf.append(field.getClassName());
- }
- }else{
- bf.append(field.getClassName());
- }
- bf.append(".");
- bf.append(field.getFieldName());
-
- bf.append(" ");
- bf.append(orderedField.getSortOrder().name());
- index++;
- }
- }else{
- bf.append(" DEFAULT_ORDER_FIELD");
-
- bf.append(" ");
- bf.append(this.getSortOrder().name());
- }
- }
-
- if(printForceIndex){
- this.printForceIndex(bf);
- }
-
- return bf.toString();
- }
- }
- protected void printForceIndex(StringBuilder bf){
- if(!this.forceIndexes.isEmpty()){
- for (Iterator<Index> iterator =this.forceIndexes.iterator(); iterator.hasNext();) {
- Index forceIndex = iterator.next();
- String forceIndexSql = "/*+ index("+forceIndex.getModel().getModeledClass().getSimpleName()+" "+forceIndex.getName()+") */";
- bf.append(" ");
- bf.append(forceIndexSql);
- }
- }
- }
-
-
-
-
-
- /* ************ OBJECTS ************ */
- protected ComparatorExpressionImpl getComparatorExpression(IField field, Object value, Comparator c) {
- return new ComparatorExpressionImpl(this.objectFormatter,field,value,c);
- }
- protected BetweenExpressionImpl getBetweenExpression(IField field, Object lower, Object high) {
- return new BetweenExpressionImpl(this.objectFormatter,field,lower,high);
- }
- protected InExpressionImpl getInExpression(IField field, Object... values) {
- List<Object> lista = new ArrayList<>();
- if(values!=null && values.length>0){
- lista.addAll(Arrays.asList(values));
- }
- return new InExpressionImpl(this.objectFormatter,field, lista);
- }
- protected LikeExpressionImpl getLikeExpression(IField field, String value, LikeMode mode, boolean caseInsensitive) {
- return new LikeExpressionImpl(this.objectFormatter,field, value, mode, caseInsensitive);
- }
- protected DateTimePartExpressionImpl getDateTimePartExpression(IField field, String value, DateTimePartEnum dateTimePartEnum) {
- return new DateTimePartExpressionImpl(this.objectFormatter,field, value, dateTimePartEnum);
- }
- protected DayFormatExpressionImpl getDayFormatExpression(IField field, String value, DayFormatEnum dayFormatEnum) {
- return new DayFormatExpressionImpl(this.objectFormatter,field, value, dayFormatEnum);
- }
- protected ConjunctionExpressionImpl getConjunctionExpression() {
- return new ConjunctionExpressionImpl(this.objectFormatter);
- }
-
-
-
- /* ************ UTILITY - BUILD ************ */
- protected void buildComparatorExpression(IField field, Object value, Comparator c) {
- ComparatorExpressionImpl cExp = getComparatorExpression(field,value,c);
- if(this.expressionEngine==null){
- this.expressionEngine = cExp;
- }else{
- conjunctionWithInternalInstance(cExp);
- }
- this.expressionEngine.setNot(this.notOperator);
- }
- protected void buildComparatorExpression(Map<IField, Object> propertyNameValues,Comparator c,boolean and) {
- Iterator<IField> fieldsIt = propertyNameValues.keySet().iterator();
- ConjunctionExpressionImpl newConjunctionExpr = getConjunctionExpression();
- newConjunctionExpr.setAndConjunction(and);
- while (fieldsIt.hasNext()) {
- IField field = fieldsIt.next();
- Object value = propertyNameValues.get(field);
- newConjunctionExpr.addExpression(getComparatorExpression(field,value,c));
- }
- this.conjunctionWithInternalInstance(newConjunctionExpr);
- this.expressionEngine.setNot(this.notOperator);
- }
- protected void buildBeetweenExpression(IField field, Object lower, Object high) {
- BetweenExpressionImpl cExp = getBetweenExpression(field,lower,high);
- if(this.expressionEngine==null){
- this.expressionEngine = cExp;
- }else{
- conjunctionWithInternalInstance(cExp);
- }
- this.expressionEngine.setNot(this.notOperator);
- }
- protected void buildInExpression(IField field, Object... values) {
- InExpressionImpl cExp = getInExpression(field, values);
- if(this.expressionEngine==null){
- this.expressionEngine = cExp;
- }else{
- conjunctionWithInternalInstance(cExp);
- }
- this.expressionEngine.setNot(this.notOperator);
- }
- protected void buildLikeExpression(IField field, String value, LikeMode mode, boolean caseInsensitive) {
- LikeExpressionImpl cExp = getLikeExpression(field, value, mode, caseInsensitive);
- if(this.expressionEngine==null){
- this.expressionEngine = cExp;
- }else{
- conjunctionWithInternalInstance(cExp);
- }
- this.expressionEngine.setNot(this.notOperator);
- }
- protected void buildDateTimePartExpression(IField field, String value, DateTimePartEnum dateTimePartEnum) {
- DateTimePartExpressionImpl cExp = getDateTimePartExpression(field, value, dateTimePartEnum);
- if(this.expressionEngine==null){
- this.expressionEngine = cExp;
- }else{
- conjunctionWithInternalInstance(cExp);
- }
- this.expressionEngine.setNot(this.notOperator);
- }
- protected void buildDayFormatExpression(IField field, String value, DayFormatEnum dayFormatEnum) {
- DayFormatExpressionImpl cExp = getDayFormatExpression(field, value, dayFormatEnum);
- if(this.expressionEngine==null){
- this.expressionEngine = cExp;
- }else{
- conjunctionWithInternalInstance(cExp);
- }
- this.expressionEngine.setNot(this.notOperator);
- }
- protected void buildNotExpression(AbstractBaseExpressionImpl expr) {
- expr.setNot(true);
- if(this.expressionEngine==null){
- this.expressionEngine = expr;
- }else{
- String s1 = this.expressionEngine.toString();
- String s2 = expr.toString();
- if(s1.equals(s2)){
- // same
- this.expressionEngine = expr;
- }else{
- conjunctionWithInternalInstance(expr);
- }
- }
- }
- protected void buildConjunctionExpression(boolean and,IExpression... expressions) {
- ConjunctionExpressionImpl cExp = getConjunctionExpression();
- cExp.setAndConjunction(and);
- boolean add = false;
- for (int i = 0; i < expressions.length; i++) {
- ExpressionImpl xmlExpression = (ExpressionImpl) expressions[i];
- if(xmlExpression.expressionEngine!=null){
- cExp.addExpression(xmlExpression.expressionEngine);
- add = true;
- }
- }
- if(add){
- if(this.expressionEngine==null){
- this.expressionEngine = cExp;
- }else{
- conjunctionWithInternalInstance(cExp);
- }
- this.expressionEngine.setNot(this.notOperator);
- }
- }
- protected void conjunctionWithInternalInstance(AbstractBaseExpressionImpl newExpr) {
- ConjunctionExpressionImpl newConjunctionExpr = getConjunctionExpression();
- newConjunctionExpr.setAndConjunction(this.andLogicOperator);
- if(this.expressionEngine!=null){
- if(! (this.expressionEngine instanceof ConjunctionExpressionImpl) ){
- // se non e' una congiunzione e' una singola operazione.
- newConjunctionExpr.addExpression(this.expressionEngine);
- }else{
- // se e' una congiunzione verifico che al suo interno vi siano solo semplici operazioni e non altre congiunzioni e che l'operatore utilizzato sia quello di default.
- // se cosi' e' evito di creare una struttura simile alla seguente: ((A and B) and C)
- // Preferisco invece ricreare un nuovo oggetto equivalente: A and B and C
- boolean simpleConjunction = true;
- ConjunctionExpressionImpl cTest = (ConjunctionExpressionImpl) this.expressionEngine;
- if(cTest.isAndConjunction() != this.andLogicOperator){
- simpleConjunction = false;
- }
- if(simpleConjunction){
- for (Iterator<AbstractBaseExpressionImpl> iterator = cTest.getLista().iterator(); iterator.hasNext();) {
- AbstractBaseExpressionImpl expr = iterator.next();
- if( expr instanceof ConjunctionExpressionImpl ){
- simpleConjunction = false;
- break;
- }
- }
- }
- if(simpleConjunction){
- for (Iterator<AbstractBaseExpressionImpl> iterator = cTest.getLista().iterator(); iterator.hasNext();) {
- AbstractBaseExpressionImpl expr = iterator.next();
- // Perchè ??? expr.setNot(false); Se si setta sempre a false una operazione scritta come and().not(expr).and().equals(a,2) resetta il not.
- newConjunctionExpr.addExpression(expr);
- }
- }else{
- newConjunctionExpr.addExpression(cTest);
- }
- }
- }
- newConjunctionExpr.addExpression(newExpr);
- this.expressionEngine = newConjunctionExpr;
- this.expressionEngine.setNot(this.notOperator);
- }
-
-
-
-
-
- /* ************ UTILITY - CHECK ************ */
- protected void checkArgoments(IField field) throws ExpressionException {
- this.checkArgoments(field, true);
- }
- protected void checkArgoments(IField field, boolean constantPermit) throws ExpressionException {
- if(field==null){
- throw new ExpressionException(FIELD_IS_NULL);
- }
- if(!constantPermit &&
- (field instanceof ConstantField)
- ){
- throw new ExpressionException(FIELD_TYPE_CONSTANT_CANNOT_BE_USED);
- }
- }
-
- protected void checkArgoments(IField field, Object value) throws ExpressionException {
- this.checkArgoments(field, value, true);
- }
- protected void checkArgoments(IField field, Object value, boolean constantPermit) throws ExpressionException {
- if(field==null){
- throw new ExpressionException(FIELD_IS_NULL);
- }
- if(value==null){
- throw new ExpressionException("Value is null for field: "+field.toString());
- }
- try{
- this.objectFormatter.isSupported(value);
- }catch(Exception e){
- throw new ExpressionException("[Value] "+e.getMessage(),e);
- }
- if(!constantPermit &&
- (field instanceof ConstantField)
- ){
- throw new ExpressionException(FIELD_TYPE_CONSTANT_CANNOT_BE_USED);
- }
- }
-
- protected void checkArgoments(IField field, Object [] values) throws ExpressionException {
- this.checkArgoments(field, values, true);
- }
- protected void checkArgoments(IField field, Object [] values, boolean constantPermit) throws ExpressionException {
- if(field==null){
- throw new ExpressionException(FIELD_IS_NULL);
- }
- if(values==null){
- throw new ExpressionException("Values is null");
- }
- for (int i = 0; i < values.length; i++) {
- if(values[i]==null){
- throw new ExpressionException("Values["+i+"] is null for field: "+field.toString());
- }
- try{
- this.objectFormatter.isSupported(values[i]);
- }catch(Exception e){
- throw new ExpressionException("[Value["+i+"]] "+e.getMessage(),e);
- }
- }
- if(!constantPermit &&
- (field instanceof ConstantField)
- ){
- throw new ExpressionException(FIELD_TYPE_CONSTANT_CANNOT_BE_USED);
- }
- }
-
- protected void checkArgoments(IField field, Object lower, Object high) throws ExpressionException {
- this.checkArgoments(field, lower, high, true);
- }
- protected void checkArgoments(IField field, Object lower, Object high, boolean constantPermit) throws ExpressionException {
- if(field==null){
- throw new ExpressionException(FIELD_IS_NULL);
- }
- if(lower==null){
- throw new ExpressionException("Lower is null for field: "+field.toString());
- }
- if(high==null){
- throw new ExpressionException("High is null for field: "+field.toString());
- }
- try{
- this.objectFormatter.isSupported(lower);
- }catch(Exception e){
- throw new ExpressionException("[Lower] "+e.getMessage(),e);
- }
- try{
- this.objectFormatter.isSupported(high);
- }catch(Exception e){
- throw new ExpressionException("[High] "+e.getMessage(),e);
- }
- if(!constantPermit &&
- (field instanceof ConstantField)
- ){
- throw new ExpressionException(FIELD_TYPE_CONSTANT_CANNOT_BE_USED);
- }
- }
-
- protected void checkArgoments(Map<IField, Object> propertyNameValues) throws ExpressionException {
- this.checkArgoments(propertyNameValues, true);
- }
- protected void checkArgoments(Map<IField, Object> propertyNameValues, boolean constantPermit) throws ExpressionException {
- if(propertyNameValues == null){
- throw new ExpressionException("PropertyNameValues is null");
- }
- Iterator<IField> fieldsIt = propertyNameValues.keySet().iterator();
- while (fieldsIt.hasNext()) {
- IField iField = fieldsIt.next();
- if(iField==null){
- throw new ExpressionException(FIELD_IS_NULL);
- }
- if(propertyNameValues.get(iField)==null){
- throw new ExpressionException("Value for Field["+iField+"] is null");
- }
- try{
- this.objectFormatter.isSupported(propertyNameValues.get(iField));
- }catch(Exception e){
- throw new ExpressionException("[Value for Field["+iField+"]] "+e.getMessage(),e);
- }
- if(!constantPermit &&
- (iField instanceof ConstantField)
- ){
- throw new ExpressionException(FIELD_TYPE_CONSTANT_CANNOT_BE_USED);
- }
- }
- }
-
- protected void checkConjunctionOperation(IExpression... expressions) throws ExpressionException {
- if(expressions==null || expressions.length<=0){
- throw new ExpressionException("Expressions is null or is empty");
- }
- for (int i = 0; i < expressions.length; i++) {
- if(expressions[i] == null){
- throw new ExpressionException("Expression["+i+"] is null");
- }
- if( ! (expressions[i] instanceof ExpressionImpl)){
- throw new ExpressionException("Expression["+i+"] has wrong type expect: "+ExpressionImpl.class.getName()+" found: "+expressions[i].getClass().getName());
- }
- }
- }
-
- }