/**
*
* Copyright (c) 2006-2017, Speedment, Inc. All Rights Reserved.
*
* 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.speedment.connector.h2.internal;
import com.speedment.runtime.core.db.FieldPredicateView;
import com.speedment.runtime.core.db.SqlPredicateFragment;
import com.speedment.runtime.core.internal.manager.sql.AbstractFieldPredicateView;
import static com.speedment.runtime.core.internal.manager.sql.AbstractFieldPredicateView.of;
import static com.speedment.runtime.field.internal.predicate.PredicateUtil.getFirstOperandAsRaw;
import static com.speedment.runtime.field.internal.predicate.PredicateUtil.getFirstOperandAsRawSet;
import static com.speedment.runtime.field.internal.predicate.PredicateUtil.getInclusionOperand;
import static com.speedment.runtime.field.internal.predicate.PredicateUtil.getSecondOperand;
import com.speedment.runtime.field.predicate.FieldPredicate;
import com.speedment.runtime.field.predicate.Inclusion;
import java.util.Set;
import static java.util.stream.Collectors.joining;
/**
*
* @author Emil Forslund
*/
@SuppressWarnings("rawtypes")
public final class H2SpeedmentPredicateView extends AbstractFieldPredicateView implements FieldPredicateView {
@Override
protected SqlPredicateFragment equalIgnoreCaseHelper(String cn, FieldPredicate<?> model, boolean negated) {
return of("(LOWER(" + cn + ") = LOWER(?))", negated).add(getFirstOperandAsRaw(model)); // Will work for any collation
}
@Override
protected SqlPredicateFragment startsWithHelper(String cn, FieldPredicate<?> model, boolean negated) {
return of("(" + cn + " LIKE BINARY CONCAT(? ,'%'))", negated).add(getFirstOperandAsRaw(model));
}
@Override
protected SqlPredicateFragment startsWithIgnoreCaseHelper(String cn, FieldPredicate<?> model, boolean negated) {
return of("(LOWER(" + cn + ") LIKE BINARY CONCAT(LOWER(?) ,'%'))", negated).add(getFirstOperandAsRaw(model));
}
@Override
protected SqlPredicateFragment endsWithHelper(String cn, FieldPredicate<?> model, boolean negated) {
return of("(" + cn + " LIKE BINARY CONCAT('%', ?))", negated).add(getFirstOperandAsRaw(model));
}
@Override
protected SqlPredicateFragment endsWithIgnoreCaseHelper(String cn, FieldPredicate<?> model, boolean negated) {
return of("(LOWER(" + cn + ") LIKE BINARY CONCAT('%', LOWER(?)))", negated).add(getFirstOperandAsRaw(model));
}
@Override
protected SqlPredicateFragment containsHelper(String cn, FieldPredicate<?> model, boolean negated) {
return of("(" + cn + " LIKE BINARY CONCAT('%', ? ,'%'))", negated).add(getFirstOperandAsRaw(model));
}
@Override
protected SqlPredicateFragment containsIgnoreCaseHelper(String cn, FieldPredicate<?> model, boolean negated) {
return of("(LOWER(" + cn + ") LIKE BINARY CONCAT('%', LOWER(?) ,'%'))", negated).add(getFirstOperandAsRaw(model));
}
@Override
protected SqlPredicateFragment equalString(String cn, FieldPredicate<?> model) {
return of("(BINARY " + cn + " = ?)").add(getFirstOperandAsRaw(model));
}
@Override
protected SqlPredicateFragment notEqualString(String cn, FieldPredicate<?> model) {
return of("(NOT (BINARY " + cn + " = ?))").add(getFirstOperandAsRaw(model));
}
@Override
protected SqlPredicateFragment inString(String cn, FieldPredicate<?> model) {
return inStringHelper(cn, model, false);
}
@Override
protected SqlPredicateFragment notInString(String cn, FieldPredicate<?> model) {
return inStringHelper(cn, model, true);
}
protected SqlPredicateFragment inStringHelper(String cn, FieldPredicate<?> model, boolean negated) {
final Set<?> set = getFirstOperandAsRawSet(model);
return of("(BINARY " + cn + " IN (" + set.stream().map($ -> "?").collect(joining(",")) + "))", negated).addAll(set);
}
@Override
protected SqlPredicateFragment betweenString(String cn, FieldPredicate<?> model) {
return betweenStringHelper(cn, model, false);
}
@Override
protected SqlPredicateFragment notBetweenString(String cn, FieldPredicate<?> model) {
return betweenStringHelper(cn, model, true);
}
protected SqlPredicateFragment betweenStringHelper(String cn, FieldPredicate<?> model, boolean negated) {
final Inclusion inclusion = getInclusionOperand(model);
switch (inclusion) {
case START_EXCLUSIVE_END_EXCLUSIVE: {
return of("(" + cn + " > ? AND " + cn + " < ?)", negated).add(getFirstOperandAsRaw(model)).add(getSecondOperand(model));
}
case START_INCLUSIVE_END_EXCLUSIVE: {
return of("(" + cn + " >= ? AND " + cn + " < ?)", negated).add(getFirstOperandAsRaw(model)).add(getSecondOperand(model));
}
case START_EXCLUSIVE_END_INCLUSIVE: {
return of("(" + cn + " > ? AND " + cn + " <= ?)", negated).add(getFirstOperandAsRaw(model)).add(getSecondOperand(model));
}
case START_INCLUSIVE_END_INCLUSIVE: {
return of("(" + cn + " >= ? AND " + cn + " <= ?)", negated).add(getFirstOperandAsRaw(model)).add(getSecondOperand(model));
}
}
throw new IllegalArgumentException("Unknown Inclusion:" + inclusion);
}
@Override
protected SqlPredicateFragment lessOrEqualString(String cn, FieldPredicate<?> model) {
return of("(BINARY " + cn + " <= ?)").add(getFirstOperandAsRaw(model));
}
@Override
protected SqlPredicateFragment lessThanString(String cn, FieldPredicate<?> model) {
return of("(BINARY " + cn + " < ?)").add(getFirstOperandAsRaw(model));
}
@Override
protected SqlPredicateFragment greaterOrEqualString(String cn, FieldPredicate<?> model) {
return of("(BINARY " + cn + " >= ?)").add(getFirstOperandAsRaw(model));
}
@Override
protected SqlPredicateFragment greaterThanString(String cn, FieldPredicate<?> model) {
return of("(BINARY " + cn + " > ?)").add(getFirstOperandAsRaw(model));
}
}