All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.tinygroup.jsqlparser.util.deparser.ExpressionDeParser Maven / Gradle / Ivy

There is a newer version: 3.4.9
Show newest version
/**
 *  Copyright (c) 1997-2013, www.tinygroup.org ([email protected]).
 *
 *  Licensed under the GPL, Version 3.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.gnu.org/licenses/gpl.html
 *
 *  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.tinygroup.jsqlparser.util.deparser;

import org.tinygroup.jsqlparser.expression.*;
import org.tinygroup.jsqlparser.expression.operators.arithmetic.*;
import org.tinygroup.jsqlparser.expression.operators.conditional.AndExpression;
import org.tinygroup.jsqlparser.expression.operators.conditional.OrExpression;
import org.tinygroup.jsqlparser.expression.operators.relational.*;
import org.tinygroup.jsqlparser.schema.Column;
import org.tinygroup.jsqlparser.schema.Table;
import org.tinygroup.jsqlparser.statement.select.SelectVisitor;
import org.tinygroup.jsqlparser.statement.select.SubSelect;

import java.util.Iterator;

/**
 * A class to de-parse (that is, tranform from JSqlParser hierarchy into a
 * string) an {@link org.tinygroup.jsqlparser.expression.Expression}
 */
public class ExpressionDeParser implements ExpressionVisitor, ItemsListVisitor {

    protected StringBuilder buffer;
    protected SelectVisitor selectVisitor;
    protected boolean useBracketsInExprList = true;

    public ExpressionDeParser() {
    }

    /**
     * @param selectVisitor a SelectVisitor to de-parse SubSelects. It has to
     * share the same
StringBuilder as this object in order to work, as: * *
     * 
     * StringBuilder myBuf = new StringBuilder();
     * MySelectDeparser selectDeparser = new  MySelectDeparser();
     * selectDeparser.setBuffer(myBuf);
     * ExpressionDeParser expressionDeParser = new ExpressionDeParser(selectDeparser, myBuf);
     * 
     * 
* * @param buffer the buffer that will be filled with the expression */ public ExpressionDeParser(SelectVisitor selectVisitor, StringBuilder buffer) { this.selectVisitor = selectVisitor; this.buffer = buffer; } public StringBuilder getBuffer() { return buffer; } public void setBuffer(StringBuilder buffer) { this.buffer = buffer; } public void visit(Addition addition) { visitBinaryExpression(addition, " + "); } public void visit(AndExpression andExpression) { visitBinaryExpression(andExpression, " AND "); } public void visit(Between between) { between.getLeftExpression().accept(this); if (between.isNot()) { buffer.append(" NOT"); } buffer.append(" BETWEEN "); between.getBetweenExpressionStart().accept(this); buffer.append(" AND "); between.getBetweenExpressionEnd().accept(this); } public void visit(EqualsTo equalsTo) { visitOldOracleJoinBinaryExpression(equalsTo, " = "); } public void visit(Division division) { visitBinaryExpression(division, " / "); } public void visit(DoubleValue doubleValue) { buffer.append(doubleValue.toString()); } public void visitOldOracleJoinBinaryExpression(OldOracleJoinBinaryExpression expression, String operator) { if (expression.isNot()) { buffer.append(" NOT "); } expression.getLeftExpression().accept(this); if (expression.getOldOracleJoinSyntax() == EqualsTo.ORACLE_JOIN_RIGHT) { buffer.append("(+)"); } buffer.append(operator); expression.getRightExpression().accept(this); if (expression.getOldOracleJoinSyntax() == EqualsTo.ORACLE_JOIN_LEFT) { buffer.append("(+)"); } } public void visit(GreaterThan greaterThan) { visitOldOracleJoinBinaryExpression(greaterThan, " > "); } public void visit(GreaterThanEquals greaterThanEquals) { visitOldOracleJoinBinaryExpression(greaterThanEquals, " >= "); } public void visit(InExpression inExpression) { if (inExpression.getLeftExpression() == null) { inExpression.getLeftItemsList().accept(this); } else { inExpression.getLeftExpression().accept(this); if (inExpression.getOldOracleJoinSyntax() == SupportsOldOracleJoinSyntax.ORACLE_JOIN_RIGHT) { buffer.append("(+)"); } } if (inExpression.isNot()) { buffer.append(" NOT"); } buffer.append(" IN "); inExpression.getRightItemsList().accept(this); } public void visit(SignedExpression signedExpression) { buffer.append(signedExpression.getSign()); signedExpression.getExpression().accept(this); } public void visit(IsNullExpression isNullExpression) { isNullExpression.getLeftExpression().accept(this); if (isNullExpression.isNot()) { buffer.append(" IS NOT NULL"); } else { buffer.append(" IS NULL"); } } public void visit(JdbcParameter jdbcParameter) { buffer.append("?"); } public void visit(LikeExpression likeExpression) { visitBinaryExpression(likeExpression, " LIKE "); String escape = likeExpression.getEscape(); if (escape != null) { buffer.append(" ESCAPE '").append(escape).append('\''); } } public void visit(ExistsExpression existsExpression) { if (existsExpression.isNot()) { buffer.append("NOT EXISTS "); } else { buffer.append("EXISTS "); } existsExpression.getRightExpression().accept(this); } public void visit(LongValue longValue) { buffer.append(longValue.getStringValue()); } public void visit(MinorThan minorThan) { visitOldOracleJoinBinaryExpression(minorThan, " < "); } public void visit(MinorThanEquals minorThanEquals) { visitOldOracleJoinBinaryExpression(minorThanEquals, " <= "); } public void visit(Multiplication multiplication) { visitBinaryExpression(multiplication, " * "); } public void visit(NotEqualsTo notEqualsTo) { visitOldOracleJoinBinaryExpression(notEqualsTo, " " + notEqualsTo.getStringExpression() + " "); } public void visit(NullValue nullValue) { buffer.append("NULL"); } public void visit(OrExpression orExpression) { visitBinaryExpression(orExpression, " OR "); } public void visit(Parenthesis parenthesis) { if (parenthesis.isNot()) { buffer.append(" NOT "); } buffer.append("("); parenthesis.getExpression().accept(this); buffer.append(")"); } public void visit(StringValue stringValue) { buffer.append("'").append(stringValue.getValue()).append("'"); } public void visit(Subtraction subtraction) { visitBinaryExpression(subtraction, " - "); } private void visitBinaryExpression(BinaryExpression binaryExpression, String operator) { if (binaryExpression.isNot()) { buffer.append(" NOT "); } binaryExpression.getLeftExpression().accept(this); buffer.append(operator); binaryExpression.getRightExpression().accept(this); } public void visit(SubSelect subSelect) { buffer.append("("); subSelect.getSelectBody().accept(selectVisitor); buffer.append(")"); } public void visit(Column tableColumn) { final Table table = tableColumn.getTable(); String tableName = null; if (table != null) { if (table.getAlias() != null) { tableName = table.getAlias().getName(); } else { tableName = table.getFullyQualifiedName(); } } if (tableName != null && !(tableName == null || tableName.length() == 0)) { buffer.append(tableName).append("."); } buffer.append(tableColumn.getColumnName()); } public void visit(Function function) { if (function.isEscaped()) { buffer.append("{fn "); } buffer.append(function.getName()); if (function.isAllColumns() && function.getParameters() == null) { buffer.append("(*)"); } else if (function.getParameters() == null) { buffer.append("()"); } else { boolean oldUseBracketsInExprList = useBracketsInExprList; if (function.isDistinct()) { useBracketsInExprList = false; buffer.append("(DISTINCT "); } else if (function.isAllColumns()) { useBracketsInExprList = false; buffer.append("(ALL "); } visit(function.getParameters()); useBracketsInExprList = oldUseBracketsInExprList; if (function.isDistinct() || function.isAllColumns()) { buffer.append(")"); } } if (function.isEscaped()) { buffer.append("}"); } } public void visit(ExpressionList expressionList) { if (useBracketsInExprList) { buffer.append("("); } for (Iterator iter = expressionList.getExpressions().iterator(); iter.hasNext();) { Expression expression = iter.next(); expression.accept(this); if (iter.hasNext()) { buffer.append(", "); } } if (useBracketsInExprList) { buffer.append(")"); } } public SelectVisitor getSelectVisitor() { return selectVisitor; } public void setSelectVisitor(SelectVisitor visitor) { selectVisitor = visitor; } public void visit(DateValue dateValue) { buffer.append("{d '").append(dateValue.getValue().toString()).append("'}"); } public void visit(TimestampValue timestampValue) { buffer.append("{ts '").append(timestampValue.getValue().toString()).append("'}"); } public void visit(TimeValue timeValue) { buffer.append("{t '").append(timeValue.getValue().toString()).append("'}"); } public void visit(CaseExpression caseExpression) { buffer.append("CASE "); Expression switchExp = caseExpression.getSwitchExpression(); if (switchExp != null) { switchExp.accept(this); buffer.append(" "); } for (Expression exp : caseExpression.getWhenClauses()) { exp.accept(this); } Expression elseExp = caseExpression.getElseExpression(); if (elseExp != null) { buffer.append("ELSE "); elseExp.accept(this); buffer.append(" "); } buffer.append("END"); } public void visit(WhenClause whenClause) { buffer.append("WHEN "); whenClause.getWhenExpression().accept(this); buffer.append(" THEN "); whenClause.getThenExpression().accept(this); buffer.append(" "); } public void visit(AllComparisonExpression allComparisonExpression) { buffer.append(" ALL "); allComparisonExpression.getSubSelect().accept((ExpressionVisitor) this); } public void visit(AnyComparisonExpression anyComparisonExpression) { buffer.append(" ANY "); anyComparisonExpression.getSubSelect().accept((ExpressionVisitor) this); } public void visit(Concat concat) { visitBinaryExpression(concat, " || "); } public void visit(Matches matches) { visitOldOracleJoinBinaryExpression(matches, " @@ "); } public void visit(BitwiseAnd bitwiseAnd) { visitBinaryExpression(bitwiseAnd, " & "); } public void visit(BitwiseOr bitwiseOr) { visitBinaryExpression(bitwiseOr, " | "); } public void visit(BitwiseXor bitwiseXor) { visitBinaryExpression(bitwiseXor, " ^ "); } public void visit(CastExpression cast) { if (cast.isUseCastKeyword()) { buffer.append("CAST("); buffer.append(cast.getLeftExpression()); buffer.append(" AS "); buffer.append(cast.getType()); buffer.append(")"); } else { buffer.append(cast.getLeftExpression()); buffer.append("::"); buffer.append(cast.getType()); } } public void visit(Modulo modulo) { visitBinaryExpression(modulo, " % "); } public void visit(AnalyticExpression aexpr) { buffer.append(aexpr.toString()); } public void visit(ExtractExpression eexpr) { buffer.append(eexpr.toString()); } public void visit(MultiExpressionList multiExprList) { for (Iterator it = multiExprList.getExprList().iterator(); it.hasNext();) { it.next().accept(this); if (it.hasNext()) { buffer.append(", "); } } } public void visit(IntervalExpression iexpr) { buffer.append(iexpr.toString()); } public void visit(JdbcNamedParameter jdbcNamedParameter) { buffer.append(jdbcNamedParameter.toString()); } public void visit(OracleHierarchicalExpression oexpr) { buffer.append(oexpr.toString()); } public void visit(RegExpMatchOperator rexpr) { visitBinaryExpression(rexpr, " " + rexpr.getStringExpression() + " "); } public void visit(RegExpMySQLOperator rexpr) { visitBinaryExpression(rexpr, " " + rexpr.getStringExpression() + " "); } public void visit(JsonExpression jsonExpr) { buffer.append(jsonExpr.toString()); } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy