Search in sources :

Example 1 with SubqueryExpression

use of org.datanucleus.query.expression.SubqueryExpression in project datanucleus-rdbms by datanucleus.

the class QueryToSQLMapper method processSubqueryExpression.

/* (non-Javadoc)
     * @see org.datanucleus.query.evaluator.AbstractExpressionEvaluator#processSubqueryExpression(org.datanucleus.query.expression.SubqueryExpression)
     */
@Override
protected Object processSubqueryExpression(SubqueryExpression expr) {
    String keyword = expr.getKeyword();
    Expression subqueryExpr = expr.getRight();
    if (subqueryExpr instanceof VariableExpression) {
        processVariableExpression((VariableExpression) subqueryExpr);
        SQLExpression subquerySqlExpr = stack.pop();
        if (keyword.equals("EXISTS")) {
            // EXISTS expressions need to be Boolean
            if (subquerySqlExpr instanceof org.datanucleus.store.rdbms.sql.expression.SubqueryExpression) {
                SQLStatement subStmt = ((org.datanucleus.store.rdbms.sql.expression.SubqueryExpression) subquerySqlExpr).getSubqueryStatement();
                subquerySqlExpr = new BooleanSubqueryExpression(stmt, keyword, subStmt);
            } else {
                SQLStatement subStmt = ((SubqueryExpressionComponent) subquerySqlExpr).getSubqueryStatement();
                subquerySqlExpr = new BooleanSubqueryExpression(stmt, keyword, subStmt);
            }
        } else if (subquerySqlExpr instanceof org.datanucleus.store.rdbms.sql.expression.SubqueryExpression) {
            SQLStatement subStmt = ((org.datanucleus.store.rdbms.sql.expression.SubqueryExpression) subquerySqlExpr).getSubqueryStatement();
            subquerySqlExpr = new BooleanSubqueryExpression(stmt, keyword, subStmt);
        } else if (subquerySqlExpr instanceof NumericSubqueryExpression) {
            if ((keyword.equalsIgnoreCase("SOME") || keyword.equalsIgnoreCase("ALL") || keyword.equalsIgnoreCase("ANY")) && !storeMgr.getDatastoreAdapter().supportsOption(DatastoreAdapter.SOME_ANY_ALL_SUBQUERY_EXPRESSIONS)) {
                throw new NucleusException("'SOME|ALL|ANY{subquery}' is not supported by this datastore");
            }
            // Apply keyword (e.g ALL, SOME, ANY) to numeric expressions
            ((NumericSubqueryExpression) subquerySqlExpr).setKeyword(keyword);
        }
        stack.push(subquerySqlExpr);
        return subquerySqlExpr;
    }
    throw new NucleusException("Dont currently support SubqueryExpression " + keyword + " for type " + subqueryExpr);
}
Also used : SQLExpression(org.datanucleus.store.rdbms.sql.expression.SQLExpression) VariableExpression(org.datanucleus.query.expression.VariableExpression) SQLStatement(org.datanucleus.store.rdbms.sql.SQLStatement) NumericSubqueryExpression(org.datanucleus.store.rdbms.sql.expression.NumericSubqueryExpression) BooleanSubqueryExpression(org.datanucleus.store.rdbms.sql.expression.BooleanSubqueryExpression) NumericSubqueryExpression(org.datanucleus.store.rdbms.sql.expression.NumericSubqueryExpression) StringSubqueryExpression(org.datanucleus.store.rdbms.sql.expression.StringSubqueryExpression) SubqueryExpression(org.datanucleus.query.expression.SubqueryExpression) TemporalSubqueryExpression(org.datanucleus.store.rdbms.sql.expression.TemporalSubqueryExpression) CaseExpression(org.datanucleus.query.expression.CaseExpression) BooleanSubqueryExpression(org.datanucleus.store.rdbms.sql.expression.BooleanSubqueryExpression) StringExpression(org.datanucleus.store.rdbms.sql.expression.StringExpression) JoinExpression(org.datanucleus.query.expression.JoinExpression) NumericSubqueryExpression(org.datanucleus.store.rdbms.sql.expression.NumericSubqueryExpression) StringSubqueryExpression(org.datanucleus.store.rdbms.sql.expression.StringSubqueryExpression) ClassExpression(org.datanucleus.query.expression.ClassExpression) InvokeExpression(org.datanucleus.query.expression.InvokeExpression) MapExpression(org.datanucleus.store.rdbms.sql.expression.MapExpression) SubqueryExpression(org.datanucleus.query.expression.SubqueryExpression) NewObjectExpression(org.datanucleus.store.rdbms.sql.expression.NewObjectExpression) TemporalSubqueryExpression(org.datanucleus.store.rdbms.sql.expression.TemporalSubqueryExpression) BooleanExpression(org.datanucleus.store.rdbms.sql.expression.BooleanExpression) OrderExpression(org.datanucleus.query.expression.OrderExpression) PrimaryExpression(org.datanucleus.query.expression.PrimaryExpression) SQLExpression(org.datanucleus.store.rdbms.sql.expression.SQLExpression) UnboundExpression(org.datanucleus.store.rdbms.sql.expression.UnboundExpression) TemporalExpression(org.datanucleus.store.rdbms.sql.expression.TemporalExpression) ArrayExpression(org.datanucleus.query.expression.ArrayExpression) ResultAliasExpression(org.datanucleus.store.rdbms.sql.expression.ResultAliasExpression) CreatorExpression(org.datanucleus.query.expression.CreatorExpression) Expression(org.datanucleus.query.expression.Expression) TypeExpression(org.datanucleus.query.expression.TypeExpression) NumericExpression(org.datanucleus.store.rdbms.sql.expression.NumericExpression) CollectionExpression(org.datanucleus.store.rdbms.sql.expression.CollectionExpression) DyadicExpression(org.datanucleus.query.expression.DyadicExpression) ParameterExpression(org.datanucleus.query.expression.ParameterExpression) ColumnExpression(org.datanucleus.store.rdbms.sql.expression.ColumnExpression) VariableExpression(org.datanucleus.query.expression.VariableExpression) BooleanSubqueryExpression(org.datanucleus.store.rdbms.sql.expression.BooleanSubqueryExpression) SubqueryExpressionComponent(org.datanucleus.store.rdbms.sql.expression.SubqueryExpressionComponent) NucleusException(org.datanucleus.exceptions.NucleusException)

Example 2 with SubqueryExpression

use of org.datanucleus.query.expression.SubqueryExpression in project tests by datanucleus.

the class JPQLCompilerTest method testFilterWithExistsSubquery.

/**
 * Tests for "EXISTS (subquery)".
 */
public void testFilterWithExistsSubquery() {
    JavaQueryCompiler compiler = null;
    QueryCompilation compilation = null;
    try {
        compiler = new JPQLCompiler(nucCtx, nucCtx.getClassLoaderResolver(null), null, Project.class, null, "EXISTS (SUBQ_1)", null, null, null, null, null, null, null);
        compilation = compiler.compile(new HashMap(), null);
    } catch (NucleusException ne) {
        NucleusLogger.QUERY.error("Exception during compile", ne);
        fail("compilation of filter with valid field threw exception : " + ne.getMessage());
    }
    Expression expr = compilation.getExprFilter();
    assertTrue("Expression is not a SubqueryExpression", expr instanceof SubqueryExpression);
    SubqueryExpression subExpr = (SubqueryExpression) expr;
    assertEquals("Subquery keyword is incorrect", "EXISTS", subExpr.getKeyword());
    assertTrue("Subquery right expression is not VariableExpression", subExpr.getRight() instanceof VariableExpression);
    VariableExpression varExpr = (VariableExpression) subExpr.getRight();
    assertEquals("VariableExpression name is incorrect", "SUBQ_1", varExpr.getId());
}
Also used : Project(org.datanucleus.samples.annotations.models.company.Project) JavaQueryCompiler(org.datanucleus.query.compiler.JavaQueryCompiler) HashMap(java.util.HashMap) SubqueryExpression(org.datanucleus.query.expression.SubqueryExpression) DyadicExpression(org.datanucleus.query.expression.DyadicExpression) JoinExpression(org.datanucleus.query.expression.JoinExpression) ClassExpression(org.datanucleus.query.expression.ClassExpression) ParameterExpression(org.datanucleus.query.expression.ParameterExpression) Expression(org.datanucleus.query.expression.Expression) InvokeExpression(org.datanucleus.query.expression.InvokeExpression) VariableExpression(org.datanucleus.query.expression.VariableExpression) PrimaryExpression(org.datanucleus.query.expression.PrimaryExpression) VariableExpression(org.datanucleus.query.expression.VariableExpression) QueryCompilation(org.datanucleus.query.compiler.QueryCompilation) NucleusException(org.datanucleus.exceptions.NucleusException) JPQLCompiler(org.datanucleus.query.compiler.JPQLCompiler) SubqueryExpression(org.datanucleus.query.expression.SubqueryExpression)

Aggregations

NucleusException (org.datanucleus.exceptions.NucleusException)2 ClassExpression (org.datanucleus.query.expression.ClassExpression)2 DyadicExpression (org.datanucleus.query.expression.DyadicExpression)2 Expression (org.datanucleus.query.expression.Expression)2 InvokeExpression (org.datanucleus.query.expression.InvokeExpression)2 JoinExpression (org.datanucleus.query.expression.JoinExpression)2 ParameterExpression (org.datanucleus.query.expression.ParameterExpression)2 PrimaryExpression (org.datanucleus.query.expression.PrimaryExpression)2 SubqueryExpression (org.datanucleus.query.expression.SubqueryExpression)2 VariableExpression (org.datanucleus.query.expression.VariableExpression)2 HashMap (java.util.HashMap)1 JPQLCompiler (org.datanucleus.query.compiler.JPQLCompiler)1 JavaQueryCompiler (org.datanucleus.query.compiler.JavaQueryCompiler)1 QueryCompilation (org.datanucleus.query.compiler.QueryCompilation)1 ArrayExpression (org.datanucleus.query.expression.ArrayExpression)1 CaseExpression (org.datanucleus.query.expression.CaseExpression)1 CreatorExpression (org.datanucleus.query.expression.CreatorExpression)1 OrderExpression (org.datanucleus.query.expression.OrderExpression)1 TypeExpression (org.datanucleus.query.expression.TypeExpression)1 Project (org.datanucleus.samples.annotations.models.company.Project)1