com.jporm.sql.query.where.WhereExpressionBuilderImpl Maven / Gradle / Ivy
/*******************************************************************************
* Copyright 2016 Francesco Cina'
*
* Licensed under the Apache License, Version 2.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://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
******************************************************************************/
package com.jporm.sql.query.where;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import com.jporm.sql.query.processor.PropertiesProcessor;
import com.jporm.sql.query.select.SelectCommon;
import com.jporm.sql.query.where.expression.ConnectorElement;
import com.jporm.sql.query.where.expression.CustomExpressionElement;
import com.jporm.sql.query.where.expression.EqExpressionElement;
import com.jporm.sql.query.where.expression.EqPropertiesExpressionElement;
import com.jporm.sql.query.where.expression.GeExpressionElement;
import com.jporm.sql.query.where.expression.GePropertiesExpressionElement;
import com.jporm.sql.query.where.expression.GtExpressionElement;
import com.jporm.sql.query.where.expression.GtPropertiesExpressionElement;
import com.jporm.sql.query.where.expression.IEqExpressionElement;
import com.jporm.sql.query.where.expression.IEqPropertiesExpressionElement;
import com.jporm.sql.query.where.expression.ILikeExpressionElement;
import com.jporm.sql.query.where.expression.InExpressionElement;
import com.jporm.sql.query.where.expression.InSubQueryExpressionElement;
import com.jporm.sql.query.where.expression.IsNotNullExpressionElement;
import com.jporm.sql.query.where.expression.IsNullExpressionElement;
import com.jporm.sql.query.where.expression.LeExpressionElement;
import com.jporm.sql.query.where.expression.LePropertiesExpressionElement;
import com.jporm.sql.query.where.expression.LikeExpressionElement;
import com.jporm.sql.query.where.expression.LtExpressionElement;
import com.jporm.sql.query.where.expression.LtPropertiesExpressionElement;
import com.jporm.sql.query.where.expression.NInExpressionElement;
import com.jporm.sql.query.where.expression.NInSubQueryExpressionElement;
import com.jporm.sql.query.where.expression.NLikeExpressionElement;
import com.jporm.sql.query.where.expression.NeExpressionElement;
import com.jporm.sql.query.where.expression.NePropertiesExpressionElement;
import com.jporm.sql.query.where.expression.NoOpsElement;
public class WhereExpressionBuilderImpl implements WhereExpressionBuilder {
private static final String CLOSE_PARENTESIS = ") ";
private static final String OPEN_PARENTESIS = "( ";
private final static WhereExpressionElement CONNECTOR_AND = new ConnectorElement("AND ");
private final static WhereExpressionElement CONNECTOR_OR = new ConnectorElement("OR ");
private final static WhereExpressionElement CONNECTOR_NOT = new ConnectorElement("NOT ");
private final static WhereExpressionElement CONNECTOR_OR_NOT = new ConnectorElement("OR NOT ");
private final static WhereExpressionElement CONNECTOR_AND_NOT = new ConnectorElement("AND NOT ");
private final static WhereExpressionElement CONNECTOR_EMPTY = new NoOpsElement();
private final List elementList = new ArrayList();
private final boolean wrappedIntoParentesisIfMultipleElements;
private WhereExpressionElement connector = CONNECTOR_EMPTY;
WhereExpressionBuilderImpl(boolean wrappedIntoParentesisIfMultipleElements) {
this.wrappedIntoParentesisIfMultipleElements = wrappedIntoParentesisIfMultipleElements;
}
/**
* TODO Use strategy or state pattern instead
* @param nextConnector
*/
private void updateNextConnector(WhereExpressionElement nextConnector) {
if (CONNECTOR_AND.equals(connector) && CONNECTOR_NOT.equals(nextConnector) ) {
connector = CONNECTOR_AND_NOT;
} else if (CONNECTOR_OR.equals(connector) && CONNECTOR_NOT.equals(nextConnector) ) {
connector = CONNECTOR_OR_NOT;
} else if (CONNECTOR_AND_NOT.equals(connector) && CONNECTOR_NOT.equals(nextConnector)) {
connector = CONNECTOR_AND;
} else if (CONNECTOR_OR_NOT.equals(connector) && CONNECTOR_NOT.equals(nextConnector)) {
connector = CONNECTOR_OR;
} else if (CONNECTOR_NOT.equals(connector) && CONNECTOR_NOT.equals(nextConnector) ) {
connector = CONNECTOR_EMPTY;
} else if ((CONNECTOR_AND.equals(nextConnector) || CONNECTOR_OR.equals(nextConnector)) && elementList.isEmpty()) {
// do nothing
} else {
connector = nextConnector;
}
}
private WhereExpressionBuilder addExpression(final WhereExpressionElement expressionElement) {
elementList.add(connector);
elementList.add(expressionElement);
updateNextConnector(CONNECTOR_AND);
return this;
}
@Override
public final WhereExpressionBuilder allEq(final Map propertyMap) {
for (final Entry entry : propertyMap.entrySet()) {
eq(entry.getKey(), entry.getValue());
}
return this;
}
@Override
public final WhereExpressionBuilder and() {
updateNextConnector(CONNECTOR_AND);
return this;
}
@Override
public final WhereExpressionBuilder and(final String customClause, final Object... args) {
updateNextConnector(CONNECTOR_AND);
return addExpression(new CustomExpressionElement(customClause, args));
}
@Override
public final WhereExpressionBuilder and(final WhereExpressionBuilder whereExpression) {
updateNextConnector(CONNECTOR_AND);
return addExpression(whereExpression);
}
@Override
public final void sqlElementValues(final List
© 2015 - 2025 Weber Informatics LLC | Privacy Policy