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

oracle.toplink.essentials.internal.expressions.ExpressionSQLPrinter Maven / Gradle / Ivy

There is a newer version: 2.1-60f
Show newest version
/*
 * The contents of this file are subject to the terms 
 * of the Common Development and Distribution License 
 * (the "License").  You may not use this file except 
 * in compliance with the License.
 * 
 * You can obtain a copy of the license at 
 * glassfish/bootstrap/legal/CDDLv1.0.txt or 
 * https://glassfish.dev.java.net/public/CDDLv1.0.html. 
 * See the License for the specific language governing 
 * permissions and limitations under the License.
 * 
 * When distributing Covered Code, include this CDDL 
 * HEADER in each file and include the License file at 
 * glassfish/bootstrap/legal/CDDLv1.0.txt.  If applicable, 
 * add the following below this CDDL HEADER, with the 
 * fields enclosed by brackets "[]" replaced with your 
 * own identifying information: Portions Copyright [yyyy] 
 * [name of copyright owner]
 */
// Copyright (c) 1998, 2007, Oracle. All rights reserved.  
package oracle.toplink.essentials.internal.expressions;

import java.io.*;
import java.util.*;
import oracle.toplink.essentials.internal.helper.*;
import oracle.toplink.essentials.queryframework.*;
import oracle.toplink.essentials.exceptions.*;
import oracle.toplink.essentials.expressions.*;
import oracle.toplink.essentials.internal.databaseaccess.*;
import oracle.toplink.essentials.internal.sessions.AbstractRecord;
import oracle.toplink.essentials.internal.sessions.AbstractSession;

/**
 * 

Purpose: Expression SQL printer. *

Responsibilities:

    *
  • Print an expression in SQL format. *
  • Replaces FIELD types with field names from the descriptor. *
  • Replaces PARAMETER types with row or object values. *
  • Calls accessor to print primitive types. *
* @author Dorin Sandu * @since TOPLink/Java 1.0 */ public class ExpressionSQLPrinter { /** * Stores the current session. The session accessor * is used to print all the primitive types. */ protected AbstractSession session; /** * Stores the call being created. */ protected SQLCall call; /** * Stores the row. Used to print PARAMETER nodes. */ protected AbstractRecord translationRow; /** * Indicates whether fully qualified field names * (owner + table) should be used or not. */ protected boolean shouldPrintQualifiedNames; // What we write on protected Writer writer; /** Used for distincts in functions. */ protected boolean requiresDistinct; // Used in figuring out when to print a comma in the select line protected boolean isFirstElementPrinted; public ExpressionSQLPrinter(AbstractSession session, AbstractRecord translationRow, SQLCall call, boolean printQualifiedNames) { this.session = session; this.translationRow = translationRow; this.call = call; this.shouldPrintQualifiedNames = printQualifiedNames; this.requiresDistinct = false; isFirstElementPrinted = false; } /** * Return the call. */ protected SQLCall getCall() { return call; } /** * INTERNAL: * Return the database platform specific information. */ public DatabasePlatform getPlatform() { return session.getPlatform(); } protected AbstractSession getSession() { return session; } /** * INTERNAL: * Return the row for translation */ protected AbstractRecord getTranslationRow() { return translationRow; } public Writer getWriter() { return writer; } /** * INTERNAL: * Used in figuring out when to print a comma in the select clause */ public boolean isFirstElementPrinted() { return isFirstElementPrinted; } public void printExpression(Expression expression) { translateExpression(expression); } public void printField(DatabaseField field) { if (field == null) { return; } try { // Print the field using either short or long notation i.e. owner + table name. if (shouldPrintQualifiedNames()) { getWriter().write(field.getQualifiedName()); } else { getWriter().write(field.getName()); } } catch (IOException exception) { throw ValidationException.fileError(exception); } } public void printParameter(ParameterExpression expression) { try { getCall().appendTranslationParameter(getWriter(), expression, getPlatform()); } catch (IOException exception) { throw ValidationException.fileError(exception); } } public void printParameter(DatabaseField field) { getCall().appendTranslation(getWriter(), field); } public void printPrimitive(Object value) { if (value instanceof Vector) { printValuelist((Vector)value); return; } session.getPlatform().appendLiteralToCall(getCall(), getWriter(), value); } public void printNull(ConstantExpression nullValueExpression) { if(session.getPlatform().shouldBindLiterals()) { DatabaseField field = null; Expression localBase = nullValueExpression.getLocalBase(); if(localBase.isFieldExpression()) { field = ((FieldExpression)localBase).getField(); } else if(localBase.isQueryKeyExpression()) { field = ((QueryKeyExpression)localBase).getField(); } session.getPlatform().appendLiteralToCall(getCall(), getWriter(), field); } else { session.getPlatform().appendLiteralToCall(getCall(), getWriter(), null); } } public void printString(String value) { try { getWriter().write(value); } catch (IOException exception) { throw ValidationException.fileError(exception); } } public void printValuelist(Vector values) { try { Enumeration valuesEnum = values.elements(); while (valuesEnum.hasMoreElements()) { Object value = valuesEnum.nextElement(); session.getPlatform().appendLiteralToCall(getCall(), getWriter(), value); if (valuesEnum.hasMoreElements()) { getWriter().write(", "); } } } catch (IOException exception) { throw ValidationException.fileError(exception); } } /** * If a distinct has been set the DISTINCT clause will be printed. * This is required for batch reading. */ public boolean requiresDistinct() { return requiresDistinct; } protected void setCall(SQLCall call) { this.call = call; } /** * INTERNAL: * Used in figuring out when to print a comma in the select clause */ public void setIsFirstElementPrinted(boolean isFirstElementPrinted) { this.isFirstElementPrinted = isFirstElementPrinted; } /** * If a distinct has been set the DISTINCT clause will be printed. * This is required for batch reading. */ public void setRequiresDistinct(boolean requiresDistinct) { this.requiresDistinct = requiresDistinct; } protected void setSession(AbstractSession theSession) { session = theSession; } protected void setShouldPrintQualifiedNames(boolean shouldPrintQualifiedNames) { this.shouldPrintQualifiedNames = shouldPrintQualifiedNames; } /** * INTERNAL: * Set the row for translation */ protected void setTranslationRow(AbstractRecord theRow) { translationRow = theRow; } public void setWriter(Writer writer) { this.writer = writer; } public boolean shouldPrintParameterValues() { return getTranslationRow() != null; } protected boolean shouldPrintQualifiedNames() { return shouldPrintQualifiedNames; } /** * Translate an expression i.e. call the appropriate * translation method for the expression based on its * type. The translation method is then responsible * for translating the subexpressions. */ protected void translateExpression(Expression theExpression) { theExpression.printSQL(this); } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy