/*
* Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
*
* 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.
*
* Other licenses:
* -----------------------------------------------------------------------------
* Commercial licenses for this work are available. These replace the above
* ASL 2.0 and offer limited warranties, support, maintenance, and commercial
* database integrations.
*
* For more information, please visit: http://www.jooq.org/licenses
*
*
*
*
*
*
*
*
*
*
*
*
*
*/
package org.jooq;
import org.jooq.conf.ParamType;
import org.jooq.conf.RenderKeywordStyle;
import org.jooq.conf.Settings;
/**
* The render context is used for rendering {@link QueryPart}'s to SQL.
* <p>
* A new render context is instantiated every time a {@link Query} is rendered.
* <code>QueryPart</code>'s will then pass the same context to their components
*
* @author Lukas Eder
* @see BindContext
*/
public interface RenderContext extends Context<RenderContext> {
/**
* Peek the next alias that will be generated by {@link #nextAlias()}.
*/
@Override
String peekAlias();
/**
* Return a new alias that is unique for the scope of one query. These
* aliases are sometimes needed when unaliased projections are defined in
* subqueries, which can lead to syntax errors.
*/
@Override
String nextAlias();
/**
* Render the context's underlying SQL statement.
*/
@Override
String render();
/**
* Render a query part in a new context derived from this one. The rendered
* SQL will not be appended to this context.
*/
@Override
String render(QueryPart part);
/**
* Append a SQL keyword to the context's contained {@link StringBuilder}.
* <p>
* Use this to have your SQL keyword rendered in {@link RenderKeywordStyle}.
*/
@Override
RenderContext keyword(String keyword);
/**
* Append some SQL to the context's contained {@link StringBuilder}.
*/
@Override
RenderContext sql(String sql);
/**
* Append some SQL to the context's contained {@link StringBuilder}.
* <p>
* Set <code>literal = true</code> to indicate that the
* <code>RenderContext</code> shall not format the argument SQL.
*/
@Override
RenderContext sql(String sql, boolean literal);
/**
* Append some SQL to the context's contained {@link StringBuilder}.
*/
@Override
RenderContext sql(char sql);
/**
* Append some SQL to the context's contained {@link StringBuilder}.
*/
@Override
RenderContext sql(int sql);
/**
* Recurse rendering.
*
* @deprecated - 3.2.0 - [#2666] - Use {@link #visit(QueryPart)} instead
*/
@Deprecated
RenderContext sql(QueryPart part);
/**
* Override the value of {@link Settings#isRenderFormatted()}.
*/
@Override
RenderContext format(boolean format);
/**
* The value of {@link Settings#isRenderFormatted()}.
*/
@Override
boolean format();
/**
* Render a new line character (only if {@link Settings#isRenderFormatted()}
* is set to <code>true</code>).
*/
@Override
RenderContext formatNewLine();
/**
* Render a new line character (only if {@link Settings#isRenderFormatted()}
* is set to <code>true</code>, and the {@link #formatPrintMargin(int)} has
* been exceeded).
*/
@Override
RenderContext formatNewLineAfterPrintMargin();
/**
* Render a new line character (only if {@link Settings#isRenderFormatted()}
* is set to <code>true</code>), or a whitespace separator character
* otherwise.
*/
@Override
RenderContext formatSeparator();
/**
* Start indenting subsequent SQL by one level (two characters), if
* {@link Settings#isRenderFormatted()} is set to <code>true</code>.
* <p>
* This is the same as calling {@link #formatIndentStart(int)} with a
* parameter of <code>2</code>
*/
@Override
RenderContext formatIndentStart();
/**
* Start indenting subsequent SQL by a number of characters, if
* {@link Settings#isRenderFormatted()} is set to <code>true</code>.
*/
@Override
RenderContext formatIndentStart(int indent);
/**
* Start indenting subsequent SQL at the same level as the current line, if
* {@link Settings#isRenderFormatted()} is set to <code>true</code>.
*/
@Override
RenderContext formatIndentLockStart();
/**
* Stop indenting subsequent SQL by one level (two characters), if
* {@link Settings#isRenderFormatted()} is set to <code>true</code>.
* <p>
* This is the same as calling {@link #formatIndentEnd(int)} with a
* parameter of <code>2</code>
*/
@Override
RenderContext formatIndentEnd();
/**
* Stop indenting subsequent SQL by a number of characters, if
* {@link Settings#isRenderFormatted()} is set to <code>true</code>.
*/
@Override
RenderContext formatIndentEnd(int indent);
/**
* Stop indenting subsequent SQL at the same level as the current line, if
* {@link Settings#isRenderFormatted()} is set to <code>true</code>.
*/
@Override
RenderContext formatIndentLockEnd();
/**
* Set a print margin that will be applied to formatted SQL, if
* {@link Settings#isRenderFormatted()} is set to <code>true</code>.
* <p>
* The default print margin is <code>80</code>. Setting this to zero or a
* negative value means that no print margin will be applied.
* <p>
* The print margin is applied to any of these <code>QueryParts</code>:
* <ul>
* <li> {@link Field#in(Field...)} and related expressions</li>
*/
@Override
RenderContext formatPrintMargin(int margin);
/**
* Append some (quoted) literal to the context's contained
* {@link StringBuilder}.
*/
@Override
RenderContext literal(String literal);
/**
* Whether bind variables should be inlined, rather than rendered as
* <code>'?'</code>.
*
* @deprecated - 3.1.0 - [#2414] - This method should no longer be used. Use
* {@link #paramType()} instead.
*/
@Deprecated
boolean inline();
/**
* Set the new context value for {@link #inline()}.
*
* @deprecated - 3.1.0 - [#2414] - This method should no longer be used. Use
* {@link #paramType(ParamType)} instead.
*/
@Deprecated
RenderContext inline(boolean inline);
/**
* Whether query parts should render qualified names or not.
*/
@Override
boolean qualify();
/**
* Sett the new context value for {@link #qualify()}.
*/
@Override
RenderContext qualify(boolean qualify);
/**
* Whether bind variables should be rendered as named parameters:<br/>
* <code> :1, :2, :custom_name</code>
* <p>
* or as JDBC bind variables <br/>
* <code> ?</code>
*
* @deprecated - 3.1.0 - [#2414] - This method should no longer be used. Use
* {@link #paramType()} instead.
*/
@Deprecated
boolean namedParams();
/**
* Set the new context value for {@link #namedParams()}.
*
* @deprecated - 3.1.0 - [#2414] - This method should no longer be used. Use
* {@link #paramType(ParamType)} instead.
*/
@Deprecated
RenderContext namedParams(boolean renderNamedParams);
/**
* Specify, how bind values should be rendered.
* <p>
* <ul>
* <li>As {@link ParamType#INDEXED} parameters: <br/>
* <code> ?, ?, ?</code></li>
* <li>As {@link ParamType#NAMED} parameters: <br/>
* <code> :1, :2, :custom_name</code></li>
* <li>As {@link ParamType#INLINED} parameters: <br/>
* <code> 1, 'A', null</code></li>
* </ul>
*/
@Override
ParamType paramType();
/**
* Set the new context value for {@link #paramType()}.
*/
@Override
RenderContext paramType(ParamType paramType);
/**
* The currently applied cast mode for bind values.
*/
@Override
CastMode castMode();
/**
* Set the new cast mode for {@link #castMode()}.
*/
@Override
RenderContext castMode(CastMode mode);
/**
* Whether casting must be applied. The result follows this logic:
* <table border="1">
* <tr>
* <th>CastMode</th>
* <th>result</th>
* </tr>
* <tr>
* <td><code>ALWAYS</code></td>
* <td><code>true</code></td>
* </tr>
* <tr>
* <td><code>NEVER</code></td>
* <td><code>false</code></td>
* </tr>
* <tr>
* <td><code>SOME</code></td>
* <td><code>true</code> or <code>false</code> depending on the dialect</td>
* </tr>
* <tr>
* <td><code>DEFAULT</code></td>
* <td><code>null</code></td>
* </tr>
* </table>
*
* @deprecated - [#3703] - 3.5.0 - Do not use this any longer
*/
@Deprecated
@Override
Boolean cast();
/**
* Set the new cast mode to {@link CastMode#SOME} for a list of dialects.
*
* @deprecated - [#3703] - 3.5.0 - Do not use this any longer
*/
@Deprecated
@Override
RenderContext castModeSome(SQLDialect... dialects);
/**
* The cast mode for bind values.
*
* @see RenderContext#castMode()
*/
enum CastMode {
/**
* Cast all bind values to their respective type.
*/
ALWAYS,
/**
* Cast no bind values to their respective type.
*/
NEVER,
/**
* Cast bind values only in some dialects. The specified dialects assume
* {@link #ALWAYS} behaviour, all the other dialects assume
* {@link #NEVER}.
*
* @deprecated - [#3703] - 3.5.0 - Do not use this any longer
*/
@Deprecated
SOME,
/**
* Cast when needed. This is the default mode if not specified
* otherwise.
*/
DEFAULT
}
}