blob: 249ed9aac84f7f994ad9c9fc9a494cc7239ff60e [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.
*/
package org.apache.openjpa.jdbc.sql;
import java.sql.SQLException;
import org.apache.openjpa.jdbc.conf.JDBCConfiguration;
import org.apache.openjpa.jdbc.kernel.JDBCFetchConfiguration;
import org.apache.openjpa.jdbc.kernel.JDBCStore;
/**
* Interface for configuring and executing a SQL select.
*
* @author Abe White
*/
public interface SelectExecutor {
/**
* Return the select configuration.
*/
JDBCConfiguration getConfiguration();
/**
* Return this select as a SQL statement formatted for the current
* dictionary.
*/
SQLBuffer toSelect(boolean forUpdate, JDBCFetchConfiguration fetch);
/**
* Get the buffer if it has been computed by a previous call to
* {@link #toSelect(boolean, JDBCFetchConfiguration)}, if any.
*
* @since 2.0.0
*/
SQLBuffer getSQL();
/**
* Return this select as a COUNT SQL statement formatted for the current
* dictionary.
*/
SQLBuffer toSelectCount();
/**
* Whether to automatically make results distinct when relational joins
* would otherwise introduce duplicates.
*/
boolean getAutoDistinct();
/**
* Whether to automatically make results distinct when relational joins
* would otherwise introduce duplicates.
*/
void setAutoDistinct(boolean distinct);
/**
* Whether this is a SELECT DISTINCT / UNION ALL.
*/
boolean isDistinct();
/**
* Whether this is a SELECT DISTINCT / UNION ALL.
*/
void setDistinct(boolean distinct);
/**
* Whether the result of this select should be treated as a large
* result set.
*/
boolean isLRS();
/**
* Whether the result of this select should be treated as a large
* result set.
*/
void setLRS(boolean lrs);
/**
* The expected result count for the query.
*/
int getExpectedResultCount();
/**
* The expected result count for the query.
*
* @param force if false, the count will be discarded if this select has
* any to-many eager joins that would throw off the result count
*/
void setExpectedResultCount(int expectedResultCount, boolean force);
/**
* The join syntax for this select, as one of the syntax constants from
* {@link JoinSyntaxes}.
*/
int getJoinSyntax();
/**
* The join syntax for this select, as one of the syntax constants from
* {@link JoinSyntaxes}.
*/
void setJoinSyntax(int joinSyntax);
/**
* Return whether this select can support a random access result set type.
*/
boolean supportsRandomAccess(boolean forUpdate);
/**
* Whether this select can be executed for update.
*/
boolean supportsLocking();
/**
* Return the number of instances matching this select.
*/
int getCount(JDBCStore store)
throws SQLException;
/**
* Execute this select in the context of the given store manager.
*/
Result execute(JDBCStore store, JDBCFetchConfiguration fetch)
throws SQLException;
/**
* Execute this select in the context of the given store manager.
*/
Result execute(JDBCStore store, JDBCFetchConfiguration fetch,
int lockLevel)
throws SQLException;
/**
* Affirm if this receiver requires more than one selects to fetch its
* data.
*
* @since 2.0.0
*/
boolean hasMultipleSelects();
}