package jef.database.query;
import java.util.List;
import jef.database.QueryAlias;
import jef.database.SqlProcessor;
import jef.database.dialect.DatabaseDialect;
import jef.database.meta.JoinKey;
import jef.database.meta.Reference;
/**
* JoinQuery.
* 由多个表Join后的查询
* @author jiyi
*
*/
public interface Join extends JoinElement{
/**
* 将当前Join对象和一个新的查询进行左外连接。
* @param right join右侧的查询对象
* @param keys join的on条件。可以通过 {@link QueryBuilder#on(jef.database.Field, jef.database.Field)}等方法生成
* @return Join的查询对象
* @see QueryBuilder#on(jef.database.Field, jef.database.Field)
* @see QueryBuilder#on(jef.database.Field, Number)
* @see QueryBuilder#on(jef.database.Field, String)
* @see QueryBuilder#on(Query, jef.database.Field, Query, jef.database.Field)
* @see QueryBuilder#on(jef.database.Field, jef.database.Condition.Operator, Object)
*/
public Join leftJoin(Query<?> right,JoinKey... keys);
/**
* 将当前Join对象和一个新的查询进行右外连接。
* @param right join右侧的查询对象
* @param keys join的on条件。可以通过 {@link QueryBuilder#on(jef.database.Field, jef.database.Field)}等方法生成
* @return Join的查询对象
* @see QueryBuilder#on(jef.database.Field, jef.database.Field)
* @see QueryBuilder#on(jef.database.Field, Number)
* @see QueryBuilder#on(jef.database.Field, String)
* @see QueryBuilder#on(Query, jef.database.Field, Query, jef.database.Field)
* @see QueryBuilder#on(jef.database.Field, jef.database.Condition.Operator, Object)
*/
public Join rightJoin(Query<?> right,JoinKey... keys);
/**
* 将当前Join对象和一个新的查询进行内连接。
* @param right join右侧的查询对象
* @param keys join的on条件。可以通过 {@link QueryBuilder#on(jef.database.Field, jef.database.Field)}等方法生成
* @return Join的查询对象
* @see QueryBuilder#on(jef.database.Field, jef.database.Field)
* @see QueryBuilder#on(jef.database.Field, Number)
* @see QueryBuilder#on(jef.database.Field, String)
* @see QueryBuilder#on(Query, jef.database.Field, Query, jef.database.Field)
* @see QueryBuilder#on(jef.database.Field, jef.database.Condition.Operator, Object)
*/
public Join innerJoin(Query<?> right,JoinKey... keys);
/**
* 将当前Join对象和一个新的查询进行全外连接。
* @param right join右侧的查询对象
* @param keys join的on条件。可以通过 {@link QueryBuilder#on(jef.database.Field, jef.database.Field)}等方法生成
* @return Join的查询对象
* @see QueryBuilder#on(jef.database.Field, jef.database.Field)
* @see QueryBuilder#on(jef.database.Field, Number)
* @see QueryBuilder#on(jef.database.Field, String)
* @see QueryBuilder#on(Query, jef.database.Field, Query, jef.database.Field)
* @see QueryBuilder#on(jef.database.Field, jef.database.Condition.Operator, Object)
*/
public Join fullJoin(Query<?> right,JoinKey... keys);
/**
* 框架内部使用<p>
* 将当前的Join转化为SQL语句中的表定义部分
* @param processor
* @param context
* @return
*/
String toTableDefinitionSql(SqlProcessor processor, SqlContext context,DatabaseDialect profile, boolean batch);
/**
* 框架内部使用<p>
* 获得当前Join对象当中所有参与的表查询
* @return
*/
List<Query<?>> elements();
/**
* 框架内部使用<p>
* 获得当前Join对象当中所有参与的表查询(含每个查询的别名)
* @return
*/
List<QueryAlias> allElements();
/**
* 框架内部使用<p>
*
* 如果该连接对象是由一个级联的单表操作形成,那么返回以下值
*
* empty List:表示该级联操作所有关联都使用延迟加载。
* 非空List,表示级联操作中,部分关联已经处理过了,后续无需处理。返回这些已经处理过的关联。
*
* 如果该连接对象不是级联形成的,返回null;
*
* @return
*/
List<Reference> getIncludedCascadeOuterJoin();
}