package ameba.db.ebean.filter; import ameba.core.ServiceLocators; import ameba.db.dsl.*; import ameba.db.dsl.QueryExprMeta.Val; import ameba.i18n.Messages; import io.ebean.Expression; import io.ebeaninternal.api.SpiEbeanServer; import io.ebeaninternal.api.SpiQuery; import org.glassfish.hk2.api.ServiceLocator; import org.glassfish.jersey.model.internal.RankedComparator; import org.glassfish.jersey.model.internal.RankedProvider; import java.util.Arrays; /** * <p>EbeanExprInvoker class.</p> * * @author icode * */ public class EbeanExprInvoker extends QueryExprInvoker<Expression> { private SpiEbeanServer server; private ServiceLocator locator; private SpiQuery<?> query; /** * <p>Constructor for EbeanExprInvoker.</p> * * @param query a {@link io.ebeaninternal.api.SpiQuery} object. * @param locator a {@link org.glassfish.hk2.api.ServiceLocator} object. */ public EbeanExprInvoker(SpiQuery<?> query, ServiceLocator locator) { this.locator = locator; this.query = query; this.server = query.getBeanDescriptor().getEbeanServer(); } /** * <p>Getter for the field <code>server</code>.</p> * * @return a {@link io.ebeaninternal.api.SpiEbeanServer} object. */ public SpiEbeanServer getServer() { return server; } /** * <p>Getter for the field <code>query</code>.</p> * * @return a {@link io.ebeaninternal.api.SpiQuery} object. */ public SpiQuery<?> getQuery() { return query; } /** * <p>Getter for the field <code>locator</code>.</p> * * @return a {@link org.glassfish.hk2.api.ServiceLocator} object. */ public ServiceLocator getLocator() { return locator; } /** * {@inheritDoc} */ @SuppressWarnings("unchecked") @Override protected Val<Expression> arg(String field, String op, Val<Expression> arg, int index, int count, QueryExprMeta parent) { Iterable<ExprArgTransformer> transformers = getTransformer(ExprArgTransformer.class); for (ExprArgTransformer transformer : transformers) { Transformed<Val<Expression>> transformed = transformer.transform( field, op, arg, index, count, this, parent ); if (transformed.success()) { return transformed.result(); } } throw new QuerySyntaxException(Messages.get("dsl.transform.err", field, op, String.valueOf(arg))); } /** * <p>getTransformer.</p> * * @param transformerClass a {@link java.lang.Class} object. * @param <R> Result. * @param <T> Transformer. * @return a {@link java.lang.Iterable} object. */ protected <R, T extends Transformer<Transformed<R>>> Iterable<T> getTransformer(Class<T> transformerClass) { Iterable<RankedProvider<T>> rankedProviders = ServiceLocators.getRankedProviders(locator, transformerClass); return ServiceLocators .sortRankedProviders(new RankedComparator<>(), rankedProviders); } /** * {@inheritDoc} */ @SuppressWarnings("unchecked") @Override protected Val<Expression> expr(String field, String op, Val<Expression>[] args, QueryExprMeta parent) { Iterable<ExprTransformer> transformers = getTransformer(ExprTransformer.class); for (ExprTransformer<Expression, EbeanExprInvoker> transformer : transformers) { Transformed<Val<Expression>> transformed = transformer.transform(field, op, args, this, parent); if (transformed.success()) { return transformed.result(); } } throw new QuerySyntaxException(Messages.get("dsl.transform.err", field, op, Arrays.toString(args))); } }