Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance. Project price only 1 $
You can buy this project and download/modify it how often you want.
/*
* Copyright 2014 - 2021 Blazebit.
*
* 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.blazebit.persistence.criteria.impl.expression;
import com.blazebit.persistence.criteria.impl.BlazeCriteriaBuilderImpl;
import com.blazebit.persistence.criteria.impl.ParameterVisitor;
import com.blazebit.persistence.criteria.impl.RenderContext;
import com.blazebit.persistence.parser.util.TypeConverter;
import com.blazebit.persistence.parser.util.TypeUtils;
import javax.persistence.criteria.Expression;
import javax.persistence.criteria.Subquery;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
/**
* @author Christian Beikov
* @since 1.2.0
*/
public class InPredicate extends AbstractSimplePredicate implements BlazeCriteriaBuilderImpl.In {
private static final long serialVersionUID = 1L;
private final Expression expression;
private final List> values;
private boolean allLiterals = true;
public InPredicate(BlazeCriteriaBuilderImpl criteriaBuilder, Expression expression) {
this(criteriaBuilder, expression, new ArrayList>());
}
public InPredicate(BlazeCriteriaBuilderImpl criteriaBuilder, Expression expression, Expression... values) {
this(criteriaBuilder, expression, Arrays.asList(values));
}
public InPredicate(BlazeCriteriaBuilderImpl criteriaBuilder, Expression expression, T... values) {
this(criteriaBuilder, expression, new ArrayList(Arrays.asList(values)));
}
public InPredicate(BlazeCriteriaBuilderImpl criteriaBuilder, Expression expression, Collection values) {
super(criteriaBuilder, false);
this.expression = expression;
this.values = new ArrayList>(values.size());
final Class javaType = expression.getJavaType();
if (javaType == null || !TypeUtils.isNumeric(javaType)) {
for (T value : values) {
this.values.add(new LiteralExpression(criteriaBuilder, value));
}
} else {
TypeConverter converter = TypeUtils.getConverter((Class) javaType, criteriaBuilder.getEntityMetamodel().getEnumTypes().keySet());
for (T value : values) {
this.values.add(new LiteralExpression(criteriaBuilder, converter.convert(value)));
}
}
}
private InPredicate(BlazeCriteriaBuilderImpl criteriaBuilder, Expression expression, List> values) {
super(criteriaBuilder, false);
if (expression instanceof ParameterExpressionImpl) {
throw new IllegalArgumentException("A parameter can't be the left hand expression of an in predicate!");
}
this.expression = expression;
this.values = values;
for (int i = 0; i < values.size(); i++) {
Expression expr = values.get(i);
if (expr == null) {
throw new IllegalArgumentException("Null expression at index: " + (i + 1));
}
allLiterals = allLiterals && expr instanceof LiteralExpression;
}
}
// Copy-constructor
private InPredicate(BlazeCriteriaBuilderImpl criteriaBuilder, boolean negated, Expression expression, List> values, boolean allLiterals) {
super(criteriaBuilder, negated);
this.expression = expression;
this.values = values;
this.allLiterals = allLiterals;
}
@Override
public AbstractPredicate copyNegated() {
return new InPredicate(criteriaBuilder, !isNegated(), expression, values, allLiterals);
}
@Override
@SuppressWarnings("unchecked")
public Expression getExpression() {
return (Expression) expression;
}
@Override
public InPredicate value(T value) {
return value(new LiteralExpression(criteriaBuilder, value));
}
@Override
public InPredicate value(Expression value) {
values.add(value);
allLiterals = allLiterals && value instanceof LiteralExpression;
return this;
}
@Override
public void visitParameters(ParameterVisitor visitor) {
visitor.visit(expression);
for (Expression expr : values) {
visitor.visit(expr);
}
}
@Override
@SuppressWarnings("unchecked")
public void render(RenderContext context) {
List> values = this.values;
StringBuilder buffer = context.getBuffer();
switch (values.size()) {
case 0:
if (isNegated()) {
buffer.append("1=1");
} else {
buffer.append("1=0");
}
return;
case 1:
Expression first = values.get(0);
if (first instanceof Subquery || (first instanceof ParameterExpressionImpl && Collection.class.isAssignableFrom(((ParameterExpressionImpl) first).getParameterType())) || allLiterals) {
context.apply(expression);
if (isNegated()) {
buffer.append(" NOT");
}
buffer.append(" IN ");
if (allLiterals) {
List