public FAFQueryMethodIUDBaseForge( StatementSpecCompiled spec, Compilable compilable, StatementRawInfo statementRawInfo, StatementCompileTimeServices services) { this.annotations = spec.Annotations; this.hasTableAccess = spec.Raw.IntoTableSpec != null || (spec.TableAccessNodes != null && spec.TableAccessNodes.Count > 0); if (spec.Raw.InsertIntoDesc != null && services.TableCompileTimeResolver.Resolve(spec.Raw.InsertIntoDesc.EventTypeName) != null) { hasTableAccess = true; } if (spec.Raw.FireAndForgetSpec is FireAndForgetSpecUpdate || spec.Raw.FireAndForgetSpec is FireAndForgetSpecDelete) { hasTableAccess |= spec.StreamSpecs[0] is TableQueryStreamSpec; } hasTableAccess |= StatementLifecycleSvcUtil.IsSubqueryWithTable( spec.SubselectNodes, services.TableCompileTimeResolver); // validate general FAF criteria FAFQueryMethodHelper.ValidateFAFQuery(spec); // obtain processor StreamSpecCompiled streamSpec = spec.StreamSpecs[0]; processor = FireAndForgetProcessorForgeFactory.ValidateResolveProcessor(streamSpec); // obtain name and type string processorName = processor.NamedWindowOrTableName; EventType eventType = processor.EventTypeRspInputEvents; // determine alias string aliasName = processorName; if (streamSpec.OptionalStreamName != null) { aliasName = streamSpec.OptionalStreamName; } // activate subselect activations var @base = new StatementBaseInfo(compilable, spec, null, statementRawInfo, null); var subqueryNamedWindowConsumers = new List<NamedWindowConsumerStreamSpec>(); var subSelectActivationDesc = SubSelectHelperActivations.CreateSubSelectActivation( EmptyList<FilterSpecCompiled>.Instance, subqueryNamedWindowConsumers, @base, services); var subselectActivation = subSelectActivationDesc.Subselects; _additionalForgeables.AddAll(subSelectActivationDesc.AdditionalForgeables); // plan subselects var namesPerStream = new[] {aliasName}; var typesPerStream = new[] { processor.EventTypePublic }; var eventTypeNames = new[] {typesPerStream[0].Name}; SubSelectHelperForgePlan subSelectForgePlan = SubSelectHelperForgePlanner.PlanSubSelect( @base, subselectActivation, namesPerStream, typesPerStream, eventTypeNames, services); _subselectForges = subSelectForgePlan.Subselects; _additionalForgeables.AddAll(subSelectForgePlan.AdditionalForgeables); // compile filter to optimize access to named window StreamTypeServiceImpl typeService = new StreamTypeServiceImpl( new[] {eventType}, new[] {aliasName}, new[] {true}, true, false); ExcludePlanHint excludePlanHint = ExcludePlanHint.GetHint( typeService.StreamNames, statementRawInfo, services); if (spec.Raw.WhereClause != null) { queryGraph = new QueryGraphForge(1, excludePlanHint, false); EPLValidationUtil.ValidateFilterWQueryGraphSafe( queryGraph, spec.Raw.WhereClause, typeService, statementRawInfo, services); } else { queryGraph = null; } // validate expressions whereClause = EPStatementStartMethodHelperValidate.ValidateNodes( spec.Raw, typeService, null, statementRawInfo, services); // get executor InitExec(aliasName, spec, statementRawInfo, services); // plan table access tableAccessForges = ExprTableEvalHelperPlan.PlanTableAccess(spec.Raw.TableExpressions); }
public FAFQueryMethodIUDBaseForge( StatementSpecCompiled spec, Compilable compilable, StatementRawInfo statementRawInfo, StatementCompileTimeServices services) { this.annotations = spec.Annotations; this.hasTableAccess = spec.Raw.IntoTableSpec != null || (spec.TableAccessNodes != null && spec.TableAccessNodes.Count > 0); if (spec.Raw.InsertIntoDesc != null && services.TableCompileTimeResolver.Resolve(spec.Raw.InsertIntoDesc.EventTypeName) != null) { hasTableAccess = true; } if (spec.Raw.FireAndForgetSpec is FireAndForgetSpecUpdate || spec.Raw.FireAndForgetSpec is FireAndForgetSpecDelete) { hasTableAccess |= spec.StreamSpecs[0] is TableQueryStreamSpec; } // validate general FAF criteria FAFQueryMethodHelper.ValidateFAFQuery(spec); // obtain processor StreamSpecCompiled streamSpec = spec.StreamSpecs[0]; processor = FireAndForgetProcessorForgeFactory.ValidateResolveProcessor(streamSpec); // obtain name and type string processorName = processor.NamedWindowOrTableName; EventType eventType = processor.EventTypeRspInputEvents; // determine alias string aliasName = processorName; if (streamSpec.OptionalStreamName != null) { aliasName = streamSpec.OptionalStreamName; } // compile filter to optimize access to named window StreamTypeServiceImpl typeService = new StreamTypeServiceImpl( new EventType[] {eventType}, new string[] {aliasName}, new bool[] {true}, true, false); ExcludePlanHint excludePlanHint = ExcludePlanHint.GetHint( typeService.StreamNames, statementRawInfo, services); if (spec.Raw.WhereClause != null) { queryGraph = new QueryGraphForge(1, excludePlanHint, false); EPLValidationUtil.ValidateFilterWQueryGraphSafe( queryGraph, spec.Raw.WhereClause, typeService, statementRawInfo, services); } else { queryGraph = null; } // validate expressions whereClause = EPStatementStartMethodHelperValidate.ValidateNodes( spec.Raw, typeService, null, statementRawInfo, services); // get executor InitExec(aliasName, spec, statementRawInfo, services); // plan table access tableAccessForges = ExprTableEvalHelperPlan.PlanTableAccess(spec.Raw.TableExpressions); }