Search in sources :

Example 1 with ASTFunctionCall

use of org.apache.cayenne.exp.parser.ASTFunctionCall in project cayenne by apache.

the class QualifierTranslator method expressionNodeToSqlNode.

private Node expressionNodeToSqlNode(Expression node, Expression parentNode) {
    switch(node.getType()) {
        case NOT_IN:
            return new InNode(true);
        case IN:
            return new InNode(false);
        case NOT_BETWEEN:
        case BETWEEN:
            return new BetweenNode(node.getType() == NOT_BETWEEN);
        case NOT:
            return new NotNode();
        case BITWISE_NOT:
            return new BitwiseNotNode();
        case EQUAL_TO:
            return new EqualNode();
        case NOT_EQUAL_TO:
            return new NotEqualNode();
        case LIKE:
        case NOT_LIKE:
        case LIKE_IGNORE_CASE:
        case NOT_LIKE_IGNORE_CASE:
            PatternMatchNode patternMatchNode = (PatternMatchNode) node;
            boolean not = node.getType() == NOT_LIKE || node.getType() == NOT_LIKE_IGNORE_CASE;
            return new LikeNode(patternMatchNode.isIgnoringCase(), not, patternMatchNode.getEscapeChar());
        case OBJ_PATH:
            String path = (String) node.getOperand(0);
            PathTranslationResult result = pathTranslator.translatePath(context.getMetadata().getObjEntity(), path);
            return processPathTranslationResult(node, parentNode, result);
        case DB_PATH:
            String dbPath = (String) node.getOperand(0);
            PathTranslationResult dbResult = pathTranslator.translatePath(context.getMetadata().getDbEntity(), dbPath);
            return processPathTranslationResult(node, parentNode, dbResult);
        case DBID_PATH:
            String dbIdPath = (String) node.getOperand(0);
            PathTranslationResult dbIdResult = pathTranslator.translateIdPath(context.getMetadata().getObjEntity(), dbIdPath);
            return processPathTranslationResult(node, parentNode, dbIdResult);
        case FUNCTION_CALL:
            ASTFunctionCall functionCall = (ASTFunctionCall) node;
            return function(functionCall.getFunctionName()).build();
        case ADD:
        case SUBTRACT:
        case MULTIPLY:
        case DIVIDE:
        case NEGATIVE:
        case BITWISE_AND:
        case BITWISE_LEFT_SHIFT:
        case BITWISE_OR:
        case BITWISE_RIGHT_SHIFT:
        case BITWISE_XOR:
        case OR:
        case AND:
        case LESS_THAN:
        case LESS_THAN_EQUAL_TO:
        case GREATER_THAN:
        case GREATER_THAN_EQUAL_TO:
            return new OpExpressionNode(expToStr(node.getType()));
        case TRUE:
        case FALSE:
        case ASTERISK:
            return new TextNode(' ' + expToStr(node.getType()));
        case CUSTOM_OP:
            return new OpExpressionNode(((ASTCustomOperator) node).getOperator());
        case EXISTS:
            return new FunctionNode("EXISTS", null, false);
        case NOT_EXISTS:
            return new FunctionNode("NOT EXISTS", null, false);
        case SUBQUERY:
            ASTSubquery subquery = (ASTSubquery) node;
            DefaultSelectTranslator translator = new DefaultSelectTranslator(subquery.getQuery(), context);
            translator.translate();
            return translator.getContext().getSelectBuilder().build();
        case ENCLOSING_OBJECT:
            // Translate via parent context's translator
            Expression expression = (Expression) node.getOperand(0);
            if (context.getParentContext() == null) {
                throw new CayenneRuntimeException("Unable to translate qualifier, no parent context to use for expression " + node);
            }
            expressionsToSkip.add(expression);
            return context.getParentContext().getQualifierTranslator().translate(expression);
        case FULL_OBJECT:
            ASTFullObject fullObject = (ASTFullObject) node;
            if (fullObject.getOperandCount() == 0) {
                Collection<DbAttribute> dbAttributes = context.getMetadata().getDbEntity().getPrimaryKeys();
                if (dbAttributes.size() > 1) {
                    throw new CayenneRuntimeException("Unable to translate reference on entity with more than one PK.");
                }
                DbAttribute attribute = dbAttributes.iterator().next();
                String alias = context.getTableTree().aliasForAttributePath(attribute.getName());
                return table(alias).column(attribute).build();
            } else {
                return null;
            }
    }
    return null;
}
Also used : CayenneRuntimeException(org.apache.cayenne.CayenneRuntimeException) DbAttribute(org.apache.cayenne.map.DbAttribute) PatternMatchNode(org.apache.cayenne.exp.parser.PatternMatchNode) ASTSubquery(org.apache.cayenne.exp.parser.ASTSubquery) ASTFunctionCall(org.apache.cayenne.exp.parser.ASTFunctionCall) Expression(org.apache.cayenne.exp.Expression) ASTFullObject(org.apache.cayenne.exp.parser.ASTFullObject)

Aggregations

CayenneRuntimeException (org.apache.cayenne.CayenneRuntimeException)1 Expression (org.apache.cayenne.exp.Expression)1 ASTFullObject (org.apache.cayenne.exp.parser.ASTFullObject)1 ASTFunctionCall (org.apache.cayenne.exp.parser.ASTFunctionCall)1 ASTSubquery (org.apache.cayenne.exp.parser.ASTSubquery)1 PatternMatchNode (org.apache.cayenne.exp.parser.PatternMatchNode)1 DbAttribute (org.apache.cayenne.map.DbAttribute)1