/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.apache.deltaspike.data.impl.handler;
import java.sql.Date;
import java.sql.Time;
import java.sql.Timestamp;
import javax.enterprise.context.Dependent;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.JoinType;
import javax.persistence.metamodel.SingularAttribute;
import org.apache.deltaspike.data.api.criteria.Criteria;
import org.apache.deltaspike.data.api.criteria.CriteriaSupport;
import org.apache.deltaspike.data.api.criteria.QuerySelection;
import org.apache.deltaspike.data.impl.criteria.QueryCriteria;
import org.apache.deltaspike.data.impl.criteria.selection.AttributeQuerySelection;
import org.apache.deltaspike.data.impl.criteria.selection.numeric.Abs;
import org.apache.deltaspike.data.impl.criteria.selection.numeric.Avg;
import org.apache.deltaspike.data.impl.criteria.selection.numeric.Count;
import org.apache.deltaspike.data.impl.criteria.selection.numeric.CountDistinct;
import org.apache.deltaspike.data.impl.criteria.selection.numeric.Max;
import org.apache.deltaspike.data.impl.criteria.selection.numeric.Min;
import org.apache.deltaspike.data.impl.criteria.selection.numeric.Modulo;
import org.apache.deltaspike.data.impl.criteria.selection.numeric.Neg;
import org.apache.deltaspike.data.impl.criteria.selection.numeric.Sum;
import org.apache.deltaspike.data.impl.criteria.selection.strings.Lower;
import org.apache.deltaspike.data.impl.criteria.selection.strings.SubstringFrom;
import org.apache.deltaspike.data.impl.criteria.selection.strings.SubstringFromTo;
import org.apache.deltaspike.data.impl.criteria.selection.strings.Trim;
import org.apache.deltaspike.data.impl.criteria.selection.strings.Upper;
import org.apache.deltaspike.data.impl.criteria.selection.temporal.CurrentDate;
import org.apache.deltaspike.data.impl.criteria.selection.temporal.CurrentTime;
import org.apache.deltaspike.data.impl.criteria.selection.temporal.CurrentTimestamp;
@Dependent
public class CriteriaSupportHandler<E> extends AbstractDelegateQueryHandler<E> implements CriteriaSupport<E>
{
@Override
public Criteria<E, E> criteria()
{
return new QueryCriteria<E, E>(getEntityClass(), getEntityClass(), getEntityManager());
}
@Override
public <T> Criteria<T, T> where(Class<T> clazz)
{
return new QueryCriteria<T, T>(clazz, clazz, getEntityManager());
}
@Override
public <T> Criteria<T, T> where(Class<T> clazz, JoinType joinType)
{
return new QueryCriteria<T, T>(clazz, clazz, getEntityManager(), joinType);
}
@Override
public <X> QuerySelection<E, X> attribute(SingularAttribute<? super E, X> attribute)
{
return new AttributeQuerySelection<E, X>(attribute);
}
// ----------------------------------------------------------------------------
// NUMERIC QUERY SELECTION
// ----------------------------------------------------------------------------
@Override
public <N extends Number> QuerySelection<E, N> abs(SingularAttribute<? super E, N> attribute)
{
return new Abs<E, N>(attribute);
}
@Override
public <N extends Number> QuerySelection<E, N> avg(SingularAttribute<? super E, N> attribute)
{
return new Avg<E, N>(attribute);
}
@Override
public QuerySelection<E, Long> count(SingularAttribute<? super E, ?> attribute)
{
return new Count<E>(attribute);
}
@Override
public QuerySelection<E, Long> countDistinct(SingularAttribute<? super E, ?> attribute)
{
return new CountDistinct<E>(attribute);
}
@Override
public <N extends Number> QuerySelection<E, N> max(SingularAttribute<? super E, N> attribute)
{
return new Max<E, N>(attribute);
}
@Override
public <N extends Number> QuerySelection<E, N> min(SingularAttribute<? super E, N> attribute)
{
return new Min<E, N>(attribute);
}
@Override
public <N extends Number> QuerySelection<E, N> neg(SingularAttribute<? super E, N> attribute)
{
return new Neg<E, N>(attribute);
}
@Override
public <N extends Number> QuerySelection<E, N> sum(SingularAttribute<? super E, N> attribute)
{
return new Sum<E, N>(attribute);
}
@Override
public QuerySelection<E, Integer> modulo(SingularAttribute<? super E, Integer> attribute, Integer modulo)
{
return new Modulo<E>(attribute, modulo);
}
// ----------------------------------------------------------------------------
// STRING QUERY SELECTION
// ----------------------------------------------------------------------------
@Override
public QuerySelection<E, String> upper(SingularAttribute<? super E, String> attribute)
{
return new Upper<E>(attribute);
}
@Override
public QuerySelection<E, String> lower(SingularAttribute<? super E, String> attribute)
{
return new Lower<E>(attribute);
}
@Override
public QuerySelection<E, String> substring(SingularAttribute<? super E, String> attribute, int from)
{
return new SubstringFrom<E>(attribute, from);
}
@Override
public QuerySelection<E, String> substring(SingularAttribute<? super E, String> attribute, int from, int length)
{
return new SubstringFromTo<E>(attribute, from, length);
}
@Override
public QuerySelection<E, String> trim(SingularAttribute<? super E, String> attribute)
{
return new Trim<E>(attribute);
}
@Override
public QuerySelection<E, String> trim(CriteriaBuilder.Trimspec trimspec,
SingularAttribute<? super E, String> attribute)
{
return new Trim<E>(trimspec, attribute);
}
// ----------------------------------------------------------------------------
// TEMPORAL QUERY SELECTION
// ----------------------------------------------------------------------------
@Override
public QuerySelection<E, Date> currDate()
{
return new CurrentDate<E>();
}
@Override
public QuerySelection<E, Time> currTime()
{
return new CurrentTime<E>();
}
@Override
public QuerySelection<E, Timestamp> currTStamp()
{
return new CurrentTimestamp<E>();
}
}