private StmtForgeMethodResult Build( string @namespace, string classPostfix, StatementCompileTimeServices services) { var createDesc = @base.StatementSpec.Raw.CreateTableDesc; var tableName = createDesc.TableName; var additionalForgeables = new List<StmtClassForgeableFactory>(); // determine whether already declared as table or variable EPLValidationUtil.ValidateAlreadyExistsTableOrVariable( tableName, services.VariableCompileTimeResolver, services.TableCompileTimeResolver, services.EventTypeCompileTimeResolver); // determine key types ValidateKeyTypes(createDesc.Columns, services.ImportServiceCompileTime); // check column naming, interpret annotations var columnsValidated = ValidateExpressions(createDesc.Columns, services); var columnDescs = columnsValidated.First; additionalForgeables.AddRange(columnsValidated.Second); // analyze and plan the state holders var plan = AnalyzePlanAggregations(createDesc.TableName, columnDescs, @base.StatementRawInfo, services); additionalForgeables.AddAll(plan.AdditionalForgeables); var visibility = plan.PublicEventType.Metadata.AccessModifier; // determine context information var contextName = @base.StatementRawInfo.ContextName; NameAccessModifier? contextVisibility = null; string contextModuleName = null; if (contextName != null) { var contextDetail = services.ContextCompileTimeResolver.GetContextInfo(contextName); if (contextDetail == null) { throw new ExprValidationException("Failed to find context '" + contextName + "'"); } contextVisibility = contextDetail.ContextVisibility; contextModuleName = contextDetail.ContextModuleName; } // add table var tableMetaData = new TableMetaData( tableName, @base.ModuleName, visibility, contextName, contextVisibility, contextModuleName, plan.InternalEventType, plan.PublicEventType, plan.PrimaryKeyColumns, plan.PrimaryKeyTypes, plan.PrimaryKeyColNums, plan.TableColumns, plan.ColsAggMethod.Length); services.TableCompileTimeRegistry.NewTable(tableMetaData); var aiFactoryProviderClassName = CodeGenerationIDGenerator.GenerateClassNameSimple( typeof(StatementAIFactoryProvider), classPostfix); var statementFieldsClassName = CodeGenerationIDGenerator.GenerateClassNameSimple(typeof(StatementFields), classPostfix); var statementProviderClassName = CodeGenerationIDGenerator.GenerateClassNameSimple(typeof(StatementProvider), classPostfix); var forge = new StatementAgentInstanceFactoryCreateTableForge( aiFactoryProviderClassName, tableMetaData.TableName, plan); // build forge list var namespaceScope = new CodegenNamespaceScope( @namespace, statementFieldsClassName, services.IsInstrumented); var forgeables = additionalForgeables .Select(additional => additional.Make(namespaceScope, classPostfix)) .ToList(); var aiFactoryForgeable = new StmtClassForgeableAIFactoryProviderCreateTable( aiFactoryProviderClassName, namespaceScope, forge, tableName); forgeables.Add(aiFactoryForgeable); var selectSubscriberDescriptor = new SelectSubscriberDescriptor(); var informationals = StatementInformationalsUtil.GetInformationals( @base, EmptyList<FilterSpecCompiled>.Instance, EmptyList<ScheduleHandleCallbackProvider>.Instance, EmptyList<NamedWindowConsumerStreamSpec>.Instance, true, selectSubscriberDescriptor, namespaceScope, services); informationals.Properties.Put(StatementProperty.CREATEOBJECTNAME, createDesc.TableName); forgeables.Add( new StmtClassForgeableStmtProvider( aiFactoryProviderClassName, statementProviderClassName, informationals, namespaceScope)); forgeables.Add( new StmtClassForgeableStmtFields( statementFieldsClassName, namespaceScope, 1)); return new StmtForgeMethodResult( forgeables, EmptyList<FilterSpecCompiled>.Instance, EmptyList<ScheduleHandleCallbackProvider>.Instance, EmptyList<NamedWindowConsumerStreamSpec>.Instance, EmptyList<FilterSpecParamExprNodeForge>.Instance); }
public StmtForgeMethodResult Make( string @namespace, string classPostfix, StatementCompileTimeServices services) { var statementSpec = _base.StatementSpec; var createDesc = statementSpec.Raw.CreateVariableDesc; // Check if the variable is already declared EPLValidationUtil.ValidateAlreadyExistsTableOrVariable( createDesc.VariableName, services.VariableCompileTimeResolver, services.TableCompileTimeResolver, services.EventTypeCompileTimeResolver); // Get assignment value when compile-time-constant object initialValue = null; ExprForge initialValueExpr = null; if (createDesc.Assignment != null) { // Evaluate assignment expression StreamTypeService typeService = new StreamTypeServiceImpl( new EventType[0], new string[0], new bool[0], false, false); var validationContext = new ExprValidationContextBuilder(typeService, _base.StatementRawInfo, services).Build(); var validated = ExprNodeUtilityValidate.GetValidatedSubtree( ExprNodeOrigin.VARIABLEASSIGN, createDesc.Assignment, validationContext); if (validated.Forge.ForgeConstantType == ExprForgeConstantType.COMPILETIMECONST) { initialValue = validated.Forge.ExprEvaluator.Evaluate(null, true, null); } createDesc.Assignment = validated; initialValueExpr = validated.Forge; } var contextName = statementSpec.Raw.OptionalContextName; NameAccessModifier? contextVisibility = null; string contextModuleName = null; if (contextName != null) { var contextDetail = services.ContextCompileTimeResolver.GetContextInfo(contextName); if (contextDetail == null) { throw new ExprValidationException("Failed to find context '" + contextName + "'"); } contextVisibility = contextDetail.ContextVisibility; contextModuleName = contextDetail.ContextModuleName; } // get visibility var visibility = services.ModuleVisibilityRules.GetAccessModifierVariable(_base, createDesc.VariableName); // Compile metadata var compileTimeConstant = createDesc.IsConstant && initialValueExpr != null && initialValueExpr.ForgeConstantType.IsCompileTimeConstant; var metaData = VariableUtil.CompileVariable( createDesc.VariableName, _base.ModuleName, visibility, contextName, contextVisibility, contextModuleName, createDesc.VariableType, createDesc.IsConstant, compileTimeConstant, initialValue, services.ImportServiceCompileTime, EventBeanTypedEventFactoryCompileTime.INSTANCE, services.EventTypeRepositoryPreconfigured, services.BeanEventTypeFactoryPrivate); // Register variable services.VariableCompileTimeRegistry.NewVariable(metaData); // Statement event type var eventTypePropertyTypes = Collections.SingletonDataMap( metaData.VariableName, metaData.Type); var eventTypeName = services.EventTypeNameGeneratorStatement.AnonymousTypeName; var eventTypeMetadata = new EventTypeMetadata( eventTypeName, _base.ModuleName, EventTypeTypeClass.STATEMENTOUT, EventTypeApplicationType.MAP, NameAccessModifier.TRANSIENT, EventTypeBusModifier.NONBUS, false, EventTypeIdPair.Unassigned()); var outputEventType = BaseNestableEventUtil.MakeMapTypeCompileTime( eventTypeMetadata, eventTypePropertyTypes, null, null, null, null, services.BeanEventTypeFactoryPrivate, services.EventTypeCompileTimeResolver); services.EventTypeCompileTimeRegistry.NewType(outputEventType); // Handle output format var defaultSelectAllSpec = new StatementSpecCompiled(); defaultSelectAllSpec.SelectClauseCompiled.WithSelectExprList(new SelectClauseElementWildcard()); defaultSelectAllSpec.Raw.SelectStreamDirEnum = SelectClauseStreamSelectorEnum.RSTREAM_ISTREAM_BOTH; StreamTypeService streamTypeService = new StreamTypeServiceImpl( new EventType[] {outputEventType}, new string[] {"trigger_stream"}, new bool[] {true}, false, false); var resultSetProcessor = ResultSetProcessorFactoryFactory.GetProcessorPrototype( new ResultSetSpec(defaultSelectAllSpec), streamTypeService, null, new bool[1], false, _base.ContextPropertyRegistry, false, false, _base.StatementRawInfo, services); // Code generation var statementFieldsClassName = CodeGenerationIDGenerator.GenerateClassNameSimple(typeof(StatementFields), classPostfix); var aiFactoryProviderClassName = CodeGenerationIDGenerator.GenerateClassNameSimple( typeof(StatementAIFactoryProvider), classPostfix); var classNameRSP = CodeGenerationIDGenerator.GenerateClassNameSimple( typeof(ResultSetProcessorFactoryProvider), classPostfix); var packageScope = new CodegenNamespaceScope( @namespace, statementFieldsClassName, services.IsInstrumented); var forge = new StatementAgentInstanceFactoryCreateVariableForge( createDesc.VariableName, initialValueExpr, classNameRSP); var aiFactoryForgable = new StmtClassForgableAIFactoryProviderCreateVariable( aiFactoryProviderClassName, packageScope, forge, createDesc.VariableName); var informationals = StatementInformationalsUtil.GetInformationals( _base, Collections.GetEmptyList<FilterSpecCompiled>(), Collections.GetEmptyList<ScheduleHandleCallbackProvider>(), Collections.GetEmptyList<NamedWindowConsumerStreamSpec>(), true, resultSetProcessor.SelectSubscriberDescriptor, packageScope, services); var statementProviderClassName = CodeGenerationIDGenerator.GenerateClassNameSimple(typeof(StatementProvider), classPostfix); var stmtProvider = new StmtClassForgableStmtProvider( aiFactoryProviderClassName, statementProviderClassName, informationals, packageScope); IList<StmtClassForgable> forgables = new List<StmtClassForgable>(); forgables.Add( new StmtClassForgableRSPFactoryProvider( classNameRSP, resultSetProcessor, packageScope, _base.StatementRawInfo)); forgables.Add(aiFactoryForgable); forgables.Add(stmtProvider); forgables.Add(new StmtClassForgableStmtFields(statementFieldsClassName, packageScope, 0)); return new StmtForgeMethodResult( forgables, Collections.GetEmptyList<FilterSpecCompiled>(), Collections.GetEmptyList<ScheduleHandleCallbackProvider>(), Collections.GetEmptyList<NamedWindowConsumerStreamSpec>(), Collections.GetEmptyList<FilterSpecParamExprNodeForge>()); }