use of org.dbflute.outsidesql.OutsideSqlContext in project dbflute-core by dbflute.
the class AbstractOutsideSqlCommand method createOutsideSqlContext.
// ===================================================================================
// OutsideSql Element
// ==================
protected OutsideSqlContext createOutsideSqlContext() {
final DBMetaProvider dbmetaProvider = ResourceContext.dbmetaProvider();
final String outsideSqlPackage = ResourceContext.getOutsideSqlPackage();
final OutsideSqlContext context = _outsideSqlContextFactory.createContext(dbmetaProvider, outsideSqlPackage);
setupOutsideSqlContextProperty(context);
context.setupBehaviorQueryPathIfNeeds();
return context;
}
use of org.dbflute.outsidesql.OutsideSqlContext in project dbflute-core by dbflute.
the class TnBeanListResultSetHandler method mappingBean.
protected void mappingBean(ResultSet rs, BeanRowHandler handler) throws SQLException {
// lazy initialization because if the result is zero, the resources are unused
Map<String, String> selectColumnMap = null;
Map<String, TnPropertyMapping> propertyCache = null;
// key is relationNoSuffix, columnName
Map<String, Map<String, TnPropertyMapping>> relPropCache = null;
TnRelationRowCache relRowCache = null;
TnRelationSelector relSelector = null;
final TnBeanMetaData basePointBmd = getBeanMetaData();
// condition-bean info (variable for minimum thread local access)
final boolean hasCB = hasConditionBean();
final ConditionBean cb = hasCB ? getConditionBean() : null;
// outsideSql info (also variable for minimum thread local access)
final boolean hasOql = hasOutsideSqlContext();
final OutsideSqlContext oqlCtx = OutsideSqlContext.getOutsideSqlContextOnThread();
final boolean checkNonSp = checkNonSpecifiedColumnAccess(hasCB, cb, hasOql, oqlCtx);
final boolean colNullObj = isUseColumnNullObjectHandling(hasCB, cb);
final boolean skipRelationLoop;
{
final boolean emptyRelationCB = hasCB && isSelectedRelationEmpty(cb);
final boolean specifiedOutsideSql = hasOql && isSpecifiedOutsideSql(oqlCtx);
// if it has condition-bean that has no relation to get
// or it has outside SQL context that is specified outside-SQL,
// they are unnecessary to do relation loop
skipRelationLoop = emptyRelationCB || specifiedOutsideSql;
}
// null allowed
final Map<String, Map<String, Integer>> selectIndexMap = ResourceContext.getSelectIndexMap();
while (rs.next()) {
if (selectColumnMap == null) {
selectColumnMap = createSelectColumnMap(rs);
}
if (propertyCache == null) {
propertyCache = createPropertyCache(selectColumnMap, selectIndexMap);
}
// create row instance of base table by row property cache
final Object row = createRow(rs, selectIndexMap, propertyCache, cb);
if (skipRelationLoop) {
adjustCreatedRow(row, checkNonSp, colNullObj, basePointBmd, cb);
final boolean continueToNext = handler.handle(row);
if (!continueToNext) {
// skip rear records (basically for cursor select)
break;
}
continue;
}
if (relSelector == null) {
relSelector = createRelationSelector(hasCB, cb);
}
if (relPropCache == null) {
relPropCache = createRelationPropertyCache(selectColumnMap, selectIndexMap, relSelector);
}
if (relRowCache == null) {
relRowCache = createRelationRowCache(hasCB, cb);
}
final List<TnRelationPropertyType> rptList = basePointBmd.getRelationPropertyTypeList();
for (TnRelationPropertyType rpt : rptList) {
if (relSelector.isNonSelectedRelation(rpt.getRelationNoSuffixPart())) {
continue;
}
mappingFirstRelation(rs, row, rpt, selectColumnMap, selectIndexMap, relPropCache, relRowCache, relSelector);
}
adjustCreatedRow(row, checkNonSp, colNullObj, basePointBmd, cb);
final boolean continueToNext = handler.handle(row);
if (!continueToNext) {
// skip rear records (basically for cursor select)
break;
}
}
}
use of org.dbflute.outsidesql.OutsideSqlContext in project dbflute-core by dbflute.
the class TnStatementFactoryImpl method findStatementConfigOnThread.
// -----------------------------------------------------
// StatementConfig
// ---------------
protected StatementConfig findStatementConfigOnThread() {
final StatementConfig config;
if (ConditionBeanContext.isExistConditionBeanOnThread()) {
final ConditionBean cb = ConditionBeanContext.getConditionBeanOnThread();
config = cb.getStatementConfig();
} else if (OutsideSqlContext.isExistOutsideSqlContextOnThread()) {
final OutsideSqlContext context = OutsideSqlContext.getOutsideSqlContextOnThread();
config = context.getStatementConfig();
} else {
// update or no exist
config = InternalMapContext.getUpdateStatementConfig();
}
return config;
}
use of org.dbflute.outsidesql.OutsideSqlContext in project dbflute-core by dbflute.
the class TnBasicSelectHandler method isUseFunctionalResultSet.
protected boolean isUseFunctionalResultSet() {
// for safety result
final FetchBean fcbean = FetchAssistContext.getFetchBeanOnThread();
if (fcbean != null && fcbean.getSafetyMaxResultSize() > 0) {
// priority one
return true;
}
final FetchNarrowingBean fnbean = FetchAssistContext.getFetchNarrowingBeanOnThread();
if (fnbean != null && fnbean.isFetchNarrowingEffective()) {
// for unsupported paging (ConditionBean)
if (fnbean.isFetchNarrowingSkipStartIndexEffective() || fnbean.isFetchNarrowingLoopCountEffective()) {
// priority two
return true;
}
// for auto paging (OutsideSql)
if (OutsideSqlContext.isExistOutsideSqlContextOnThread()) {
final OutsideSqlContext outsideSqlContext = OutsideSqlContext.getOutsideSqlContextOnThread();
if (outsideSqlContext.isOffsetByCursorForcedly() || outsideSqlContext.isLimitByCursorForcedly()) {
// priority three
return true;
}
}
}
return false;
}
use of org.dbflute.outsidesql.OutsideSqlContext in project dbflute-core by dbflute.
the class TnBasicSelectHandler method doQueryResult.
protected ResultSet doQueryResult(PreparedStatement ps) throws SQLException {
// /- - - - - - - - - - - - - - - - - - - - - - - - - - -
// All select statements on DBFlute use this result set.
// - - - - - - - - - -/
final ResultSet rs = executeQuery(ps);
if (!isUseFunctionalResultSet()) {
return rs;
}
if (isInternalDebugEnabled()) {
_log.debug("...Wrapping result set by functional one");
}
final FetchBean selbean = FetchAssistContext.getFetchBeanOnThread();
final TnFetchAssistResultSet wrapper;
if (OutsideSqlContext.isExistOutsideSqlContextOnThread()) {
final OutsideSqlContext context = OutsideSqlContext.getOutsideSqlContextOnThread();
final boolean offsetByCursorForcedly = context.isOffsetByCursorForcedly();
final boolean limitByCursorForcedly = context.isLimitByCursorForcedly();
wrapper = createFunctionalResultSet(rs, selbean, offsetByCursorForcedly, limitByCursorForcedly);
} else {
wrapper = createFunctionalResultSet(rs, selbean, false, false);
}
return wrapper;
}
Aggregations