public SubordTableLookupStrategyFactoryVDW(string statementName, string statementId, Attribute[] annotations, EventType[] outerStreams, IList <SubordPropHashKey> hashKeys, CoercionDesc hashKeyCoercionTypes, IList <SubordPropRangeKey> rangeKeys, CoercionDesc rangeKeyCoercionTypes, bool nwOnTrigger, SubordPropPlan joinDesc, bool forceTableScan, SubordinateQueryPlannerIndexPropListPair hashAndRanges) { this.statementName = statementName; this.statementId = statementId; this.annotations = annotations; this.outerStreams = outerStreams; this.hashKeys = hashKeys; this.hashKeyCoercionTypes = hashKeyCoercionTypes; this.rangeKeys = rangeKeys; this.rangeKeyCoercionTypes = rangeKeyCoercionTypes; this.nwOnTrigger = nwOnTrigger; this.joinDesc = joinDesc; this.forceTableScan = forceTableScan; this.hashAndRanges = hashAndRanges; }
public static SubordinateQueryPlanDesc PlanSubquery(EventType[] outerStreams, SubordPropPlan joinDesc, bool isNWOnTrigger, bool forceTableScan, IndexHint optionalIndexHint, bool indexShare, int subqueryNumber, bool isVirtualDataWindow, EventTableIndexMetadata indexMetadata, ICollection <string> optionalUniqueKeyProps, bool onlyUseExistingIndexes, string statementName, string statementId, Attribute[] annotations) { if (isVirtualDataWindow) { var indexProps = GetIndexPropDesc(joinDesc.HashProps, joinDesc.RangeProps); var lookupStrategyFactoryVdw = new SubordTableLookupStrategyFactoryVDW(statementName, statementId, annotations, outerStreams, indexProps.HashJoinedProps, new CoercionDesc(false, indexProps.HashIndexCoercionType), indexProps.RangeJoinedProps, new CoercionDesc(false, indexProps.RangeIndexCoercionType), isNWOnTrigger, joinDesc, forceTableScan, indexProps.ListPair); return(new SubordinateQueryPlanDesc(lookupStrategyFactoryVdw, null)); } var hashKeys = Collections.GetEmptyList <SubordPropHashKey>(); CoercionDesc hashKeyCoercionTypes = null; var rangeKeys = Collections.GetEmptyList <SubordPropRangeKey>(); CoercionDesc rangeKeyCoercionTypes = null; ExprNode[] inKeywordSingleIdxKeys = null; ExprNode inKeywordMultiIdxKey = null; SubordinateQueryIndexDesc[] indexDescs; if (joinDesc.InKeywordSingleIndex != null) { var single = joinDesc.InKeywordSingleIndex; var keyInfo = new SubordPropHashKey(new QueryGraphValueEntryHashKeyedExpr(single.Expressions[0], false), null, single.CoercionType); var indexDesc = FindOrSuggestIndex( Collections.SingletonMap(single.IndexedProp, keyInfo), Collections.GetEmptyMap <string, SubordPropRangeKey>(), optionalIndexHint, indexShare, subqueryNumber, indexMetadata, optionalUniqueKeyProps, onlyUseExistingIndexes); if (indexDesc == null) { return(null); } var desc = new SubordinateQueryIndexDesc(indexDesc.IndexKeyInfo, indexDesc.IndexName, indexDesc.IndexMultiKey, indexDesc.QueryPlanIndexItem); indexDescs = new SubordinateQueryIndexDesc[] { desc }; inKeywordSingleIdxKeys = single.Expressions; } else if (joinDesc.InKeywordMultiIndex != null) { var multi = joinDesc.InKeywordMultiIndex; indexDescs = new SubordinateQueryIndexDesc[multi.IndexedProp.Length]; for (var i = 0; i < multi.IndexedProp.Length; i++) { var keyInfo = new SubordPropHashKey(new QueryGraphValueEntryHashKeyedExpr(multi.Expression, false), null, multi.CoercionType); var indexDesc = FindOrSuggestIndex( Collections.SingletonMap(multi.IndexedProp[i], keyInfo), Collections.GetEmptyMap <string, SubordPropRangeKey>(), optionalIndexHint, indexShare, subqueryNumber, indexMetadata, optionalUniqueKeyProps, onlyUseExistingIndexes); if (indexDesc == null) { return(null); } indexDescs[i] = indexDesc; } inKeywordMultiIdxKey = multi.Expression; } else { var indexDesc = FindOrSuggestIndex(joinDesc.HashProps, joinDesc.RangeProps, optionalIndexHint, false, subqueryNumber, indexMetadata, optionalUniqueKeyProps, onlyUseExistingIndexes); if (indexDesc == null) { return(null); } var indexKeyInfo = indexDesc.IndexKeyInfo; hashKeys = indexKeyInfo.OrderedHashDesc; hashKeyCoercionTypes = indexKeyInfo.OrderedKeyCoercionTypes; rangeKeys = indexKeyInfo.OrderedRangeDesc; rangeKeyCoercionTypes = indexKeyInfo.OrderedRangeCoercionTypes; var desc = new SubordinateQueryIndexDesc(indexDesc.IndexKeyInfo, indexDesc.IndexName, indexDesc.IndexMultiKey, indexDesc.QueryPlanIndexItem); indexDescs = new SubordinateQueryIndexDesc[] { desc }; } if (forceTableScan) { return(null); } var lookupStrategyFactory = SubordinateTableLookupStrategyUtil.GetLookupStrategy(outerStreams, hashKeys, hashKeyCoercionTypes, rangeKeys, rangeKeyCoercionTypes, inKeywordSingleIdxKeys, inKeywordMultiIdxKey, isNWOnTrigger); return(new SubordinateQueryPlanDesc(lookupStrategyFactory, indexDescs)); }