EQL - Add / expose via EbeanServer.createQuery(type, eql) method

This commit is contained in:
Robin Bygrave
2016-07-13 16:40:52 +12:00
parent e58cec8bdd
commit 474c2d5595
10 changed files with 215 additions and 34 deletions
@@ -40,6 +40,7 @@ import com.avaje.ebeaninternal.server.deploy.BeanDescriptorManager;
import com.avaje.ebeaninternal.server.deploy.BeanProperty;
import com.avaje.ebeaninternal.server.deploy.InheritInfo;
import com.avaje.ebeaninternal.server.el.ElFilter;
import com.avaje.ebeaninternal.server.grammer.EqlParser;
import com.avaje.ebeaninternal.server.lib.ShutdownManager;
import com.avaje.ebeaninternal.server.query.CQuery;
import com.avaje.ebeaninternal.server.query.CQueryEngine;
@@ -902,6 +903,14 @@ public final class DefaultServer implements SpiServer, SpiEbeanServer {
throw new PersistenceException("No named query called " + namedQuery + " for bean:" + beanType.getName());
}
@Override
public <T> Query<T> createQuery(Class<T> beanType, String eql) {
DefaultOrmQuery<T> query = createQuery(beanType);
EqlParser.parse(eql, query);
return query;
}
public <T> DefaultOrmQuery<T> createQuery(Class<T> beanType) {
BeanDescriptor<T> desc = getBeanDescriptor(beanType);
if (desc == null) {
@@ -954,6 +963,7 @@ public final class DefaultServer implements SpiServer, SpiEbeanServer {
SpiQuery<T> spiQuery = (SpiQuery<T>) query;
spiQuery.setType(type);
spiQuery.checkNamedParameters();
return createQueryRequest(spiQuery, t);
}
@@ -7,8 +7,14 @@ import org.antlr.v4.runtime.ANTLRInputStream;
import org.antlr.v4.runtime.CommonTokenStream;
import org.antlr.v4.runtime.tree.ParseTreeWalker;
/**
* Parse EQL query language applying it to an ORM query object.
*/
public class EqlParser {
/**
* Parse the raw EQL query and apply it to the supplied query.
*/
public static <T> void parse(String raw, SpiQuery<T> query) {
EQLLexer lexer = new EQLLexer(new ANTLRInputStream(raw));
@@ -29,6 +29,7 @@ import com.avaje.ebeaninternal.server.query.CancelableQuery;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
@@ -1395,6 +1396,16 @@ public class DefaultOrmQuery<T> implements SpiQuery<T> {
this.generatedSql = generatedSql;
}
@Override
public void checkNamedParameters() {
if (namedParams != null) {
Collection<ONamedParam> values = namedParams.values();
for (ONamedParam value : values) {
value.checkValueSet();
}
}
}
@Override
public SpiNamedParam createNamedParameter(String name) {
if (namedParams == null) {
@@ -2,21 +2,44 @@ package com.avaje.ebeaninternal.server.querydefn;
import com.avaje.ebeaninternal.api.SpiNamedParam;
import javax.persistence.PersistenceException;
/**
* Named parameter used as placeholder in expressions created by EQL language parsing.
*/
public class ONamedParam implements SpiNamedParam {
private final String name;
private Object value;
/**
* Create with the given name.
*/
public ONamedParam(String name) {
this.name = name;
}
/**
* Set the bind value for this named parameter.
*/
public void setValue(Object value) {
this.value = value;
}
/**
* Return the bind value for this named parameter.
*/
public Object getValue() {
return value;
}
/**
* Check the bind value has been set (so does not support null value).
*/
public void checkValueSet() {
if (value == null) {
throw new PersistenceException("Named parameter ["+name+"] has not had it's value set.");
}
}
}