public StmtForgeMethodResult Make( string @namespace, string classPostfix, StatementCompileTimeServices services) { var statementSpec = @base.StatementSpec; var spec = statementSpec.Raw.CreateSchemaDesc; if (services.EventTypeCompileTimeResolver.GetTypeByName(spec.SchemaName) != null) { throw new ExprValidationException( "Event type named '" + spec.SchemaName + "' has already been declared"); } EPLValidationUtil.ValidateTableExists(services.TableCompileTimeResolver, spec.SchemaName); var eventTypeForgeablesPair = HandleCreateSchema(spec, services); var statementFieldsClassName = CodeGenerationIDGenerator.GenerateClassNameSimple( typeof(StatementFields), classPostfix); var namespaceScope = new CodegenNamespaceScope( @namespace, statementFieldsClassName, services.IsInstrumented); var fieldsForgable = new StmtClassForgeableStmtFields(statementFieldsClassName, namespaceScope, 0); var aiFactoryProviderClassName = CodeGenerationIDGenerator.GenerateClassNameSimple( typeof(StatementAIFactoryProvider), classPostfix); var forge = new StatementAgentInstanceFactoryCreateSchemaForge( eventTypeForgeablesPair.EventType); var aiFactoryForgeable = new StmtClassForgeableAIFactoryProviderCreateSchema( aiFactoryProviderClassName, namespaceScope, forge); var selectSubscriberDescriptor = new SelectSubscriberDescriptor(); var informationals = StatementInformationalsUtil.GetInformationals( @base, EmptyList<FilterSpecCompiled>.Instance, EmptyList<ScheduleHandleCallbackProvider>.Instance, EmptyList<NamedWindowConsumerStreamSpec>.Instance, false, selectSubscriberDescriptor, namespaceScope, services); informationals.Properties.Put(StatementProperty.CREATEOBJECTNAME, spec.SchemaName); var statementProviderClassName = CodeGenerationIDGenerator.GenerateClassNameSimple(typeof(StatementProvider), classPostfix); var stmtProvider = new StmtClassForgeableStmtProvider( aiFactoryProviderClassName, statementProviderClassName, informationals, namespaceScope); var forgables = new List<StmtClassForgeable>(); eventTypeForgeablesPair.AdditionalForgeables.ForEach( a => forgables.Add(a.Make(namespaceScope, classPostfix))); forgables.Add(fieldsForgable); forgables.Add(aiFactoryForgeable); forgables.Add(stmtProvider); return new StmtForgeMethodResult( forgables, EmptyList<FilterSpecCompiled>.Instance, EmptyList<ScheduleHandleCallbackProvider>.Instance, EmptyList<NamedWindowConsumerStreamSpec>.Instance, EmptyList<FilterSpecParamExprNodeForge>.Instance); }
public CodegenClass Forge( bool includeDebugSymbols, bool fireAndForget) { var debugInformationProvider = new Supplier<string>( () => { var writer = new StringWriter(); writer.Write("FAF query"); return writer.ToString(); }); try { IList<CodegenInnerClass> innerClasses = new List<CodegenInnerClass>(); // build ctor IList<CodegenTypedParam> ctorParms = new List<CodegenTypedParam>(); ctorParms.Add( new CodegenTypedParam( typeof(EPStatementInitServices), EPStatementInitServicesConstants.REF.Ref, false)); ctorParms.Add( new CodegenTypedParam( _namespaceScope.FieldsClassName, null, "statementFields", true, false)); var providerCtor = new CodegenCtor(GetType(), ClassName, includeDebugSymbols, ctorParms); var classScope = new CodegenClassScope(includeDebugSymbols, _namespaceScope, ClassName); // add query method member IList<CodegenTypedParam> providerExplicitMembers = new List<CodegenTypedParam>(2); providerExplicitMembers.Add(new CodegenTypedParam(typeof(FAFQueryMethod), MEMBERNAME_QUERYMETHOD)); var symbols = new SAIFFInitializeSymbol(); var makeMethod = providerCtor.MakeChildWithScope(typeof(FAFQueryMethod), GetType(), symbols, classScope) .AddParam(typeof(EPStatementInitServices), EPStatementInitServicesConstants.REF.Ref); providerCtor.Block .ExprDotMethod(Ref("statementFields"), "Init", EPStatementInitServicesConstants.REF) .AssignRef(MEMBERNAME_QUERYMETHOD, LocalMethod(makeMethod, EPStatementInitServicesConstants.REF)); _forge.MakeMethod(makeMethod, symbols, classScope); // make provider methods var propQueryMethod = CodegenProperty.MakePropertyNode( typeof(FAFQueryMethod), GetType(), CodegenSymbolProviderEmpty.INSTANCE, classScope); propQueryMethod .GetterBlock .BlockReturn(Ref(MEMBERNAME_QUERYMETHOD)); // add get-informational methods var propQueryInformationals = CodegenProperty.MakePropertyNode( typeof(FAFQueryInformationals), GetType(), CodegenSymbolProviderEmpty.INSTANCE, classScope); var queryInformationals = FAFQueryInformationals.From( _namespaceScope.SubstitutionParamsByNumber, _namespaceScope.SubstitutionParamsByName); queryInformationals.Make( propQueryInformationals.GetterBlock, classScope); // add get-statement-fields method var propSubstitutionFieldSetter = CodegenProperty.MakePropertyNode( typeof(FAFQueryMethodAssignerSetter), GetType(), CodegenSymbolProviderEmpty.INSTANCE, classScope); StmtClassForgeableStmtFields.MakeSubstitutionSetter( _namespaceScope, propSubstitutionFieldSetter.GetterBlock, classScope); // make provider methods var methods = new CodegenClassMethods(); var properties = new CodegenClassProperties(); CodegenStackGenerator.RecursiveBuildStack(providerCtor, "ctor", methods, properties); CodegenStackGenerator.RecursiveBuildStack(propQueryMethod, "QueryMethod", methods, properties); CodegenStackGenerator.RecursiveBuildStack(propQueryInformationals, "QueryInformationals", methods, properties); CodegenStackGenerator.RecursiveBuildStack(propSubstitutionFieldSetter, "SubstitutionFieldSetter", methods, properties); // render and compile return new CodegenClass( CodegenClassType.FAFQUERYMETHODPROVIDER, typeof(FAFQueryMethodProvider), ClassName, classScope, providerExplicitMembers, providerCtor, methods, properties, innerClasses); } catch (EPException) { throw; } catch (Exception e) { throw new EPException( "Fatal exception during code-generation for " + debugInformationProvider.Invoke() + " : " + e.Message, e); } }
public StmtForgeMethodResult Make( string @namespace, string classPostfix, StatementCompileTimeServices services) { string objectName = Register(services); // define output event type string statementEventTypeName = services.EventTypeNameGeneratorStatement.AnonymousTypeName; EventTypeMetadata statementTypeMetadata = new EventTypeMetadata( statementEventTypeName, _base.ModuleName, EventTypeTypeClass.STATEMENTOUT, EventTypeApplicationType.MAP, NameAccessModifier.TRANSIENT, EventTypeBusModifier.NONBUS, false, EventTypeIdPair.Unassigned()); EventType statementEventType = BaseNestableEventUtil.MakeMapTypeCompileTime( statementTypeMetadata, EmptyDictionary <string, object> .Instance, null, null, null, null, services.BeanEventTypeFactoryPrivate, services.EventTypeCompileTimeResolver); services.EventTypeCompileTimeRegistry.NewType(statementEventType); string statementFieldsClassName = CodeGenerationIDGenerator.GenerateClassNameSimple(typeof(StatementFields), classPostfix); CodegenNamespaceScope namespaceScope = new CodegenNamespaceScope( @namespace, statementFieldsClassName, services.IsInstrumented); string aiFactoryProviderClassName = CodeGenerationIDGenerator.GenerateClassNameSimple(typeof(StatementAIFactoryProvider), classPostfix); StmtClassForgeable aiFactoryForgeable = AiFactoryForgable(aiFactoryProviderClassName, namespaceScope, statementEventType, objectName); SelectSubscriberDescriptor selectSubscriberDescriptor = new SelectSubscriberDescriptor(); StatementInformationalsCompileTime informationals = StatementInformationalsUtil.GetInformationals( _base, EmptyList <FilterSpecCompiled> .Instance, EmptyList <ScheduleHandleCallbackProvider> .Instance, EmptyList <NamedWindowConsumerStreamSpec> .Instance, false, selectSubscriberDescriptor, namespaceScope, services); informationals.Properties.Put(StatementProperty.CREATEOBJECTNAME, objectName); string statementProviderClassName = CodeGenerationIDGenerator.GenerateClassNameSimple(typeof(StatementProvider), classPostfix); StmtClassForgeableStmtProvider stmtProvider = new StmtClassForgeableStmtProvider( aiFactoryProviderClassName, statementProviderClassName, informationals, namespaceScope); var stmtClassForgeableStmtFields = new StmtClassForgeableStmtFields( statementFieldsClassName, namespaceScope, 1); IList <StmtClassForgeable> forgeables = new List <StmtClassForgeable>(); forgeables.Add(aiFactoryForgeable); forgeables.Add(stmtProvider); forgeables.Add(stmtClassForgeableStmtFields); 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 spec = _base.StatementSpec.Raw.CreateIndexDesc; var infraName = spec.WindowName; var namedWindow = services.NamedWindowCompileTimeResolver.Resolve(infraName); var table = services.TableCompileTimeResolver.Resolve(infraName); if (namedWindow == null && table == null) { throw new ExprValidationException("A named window or table by name '" + infraName + "' does not exist"); } if (namedWindow != null && table != null) { throw new ExprValidationException("A named window or table by name '" + infraName + "' are both found"); } string infraModuleName; NameAccessModifier infraVisibility; EventType indexedEventType; string infraContextName; if (namedWindow != null) { infraModuleName = namedWindow.NamedWindowModuleName; infraVisibility = namedWindow.EventType.Metadata.AccessModifier; indexedEventType = namedWindow.EventType; infraContextName = namedWindow.ContextName; } else { infraModuleName = table.TableModuleName; infraVisibility = table.TableVisibility; indexedEventType = table.InternalEventType; infraContextName = table.OptionalContextName; if (!table.IsKeyed) { throw new ExprValidationException( "Tables without primary key column(s) do not allow creating an index"); } } EPLValidationUtil.ValidateContextName( namedWindow == null, infraName, infraContextName, _base.StatementSpec.Raw.OptionalContextName, true); // validate index var explicitIndexDesc = EventTableIndexUtil.ValidateCompileExplicitIndex( spec.IndexName, spec.IsUnique, spec.Columns, indexedEventType, _base.StatementRawInfo, services); var advancedIndexDesc = explicitIndexDesc.AdvancedIndexProvisionDesc == null ? null : explicitIndexDesc.AdvancedIndexProvisionDesc.IndexDesc.AdvancedIndexDescRuntime; var imk = new IndexMultiKey( spec.IsUnique, explicitIndexDesc.HashPropsAsList, explicitIndexDesc.BtreePropsAsList, advancedIndexDesc); // add index as a new index to module-init var indexKey = new IndexCompileTimeKey( infraModuleName, infraName, infraVisibility, namedWindow != null, spec.IndexName, _base.ModuleName); services.IndexCompileTimeRegistry.NewIndex(indexKey, new IndexDetailForge(imk, explicitIndexDesc)); // add index current named window information if (namedWindow != null) { namedWindow.AddIndex(spec.IndexName, _base.ModuleName, imk, explicitIndexDesc.ToRuntime()); } else { table.AddIndex(spec.IndexName, _base.ModuleName, imk, explicitIndexDesc.ToRuntime()); } // determine multikey plan MultiKeyPlan multiKeyPlan = MultiKeyPlanner.PlanMultiKey( explicitIndexDesc.HashTypes, false, _base.StatementRawInfo, services.SerdeResolver); explicitIndexDesc.HashMultiKeyClasses = multiKeyPlan.ClassRef; DataInputOutputSerdeForge[] rangeSerdes = new DataInputOutputSerdeForge[explicitIndexDesc.RangeProps.Length]; for (int i = 0; i < explicitIndexDesc.RangeProps.Length; i++) { rangeSerdes[i] = services.SerdeResolver.SerdeForIndexBtree( explicitIndexDesc.RangeTypes[i], _base.StatementRawInfo); } explicitIndexDesc.RangeSerdes = rangeSerdes; var statementFieldsClassName = CodeGenerationIDGenerator.GenerateClassNameSimple( typeof(StatementFields), classPostfix); var namespaceScope = new CodegenNamespaceScope( @namespace, statementFieldsClassName, services.IsInstrumented); var fieldsForgeable = new StmtClassForgeableStmtFields(statementFieldsClassName, namespaceScope, 0); var aiFactoryProviderClassName = CodeGenerationIDGenerator.GenerateClassNameSimple( typeof(StatementAIFactoryProvider), classPostfix); var forge = new StatementAgentInstanceFactoryCreateIndexForge( indexedEventType, spec.IndexName, _base.ModuleName, explicitIndexDesc, imk, namedWindow, table); var aiFactoryForgeable = new StmtClassForgeableAIFactoryProviderCreateIndex( aiFactoryProviderClassName, namespaceScope, forge); 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, spec.IndexName); var statementProviderClassName = CodeGenerationIDGenerator.GenerateClassNameSimple(typeof(StatementProvider), classPostfix); var stmtProvider = new StmtClassForgeableStmtProvider( aiFactoryProviderClassName, statementProviderClassName, informationals, namespaceScope); var forgeables = new List<StmtClassForgeable>(); foreach (var additional in multiKeyPlan.MultiKeyForgeables) { forgeables.Add(additional.Make(namespaceScope, classPostfix)); } forgeables.Add(fieldsForgeable); forgeables.Add(aiFactoryForgeable); forgeables.Add(stmtProvider); return new StmtForgeMethodResult( forgeables, EmptyList<FilterSpecCompiled>.Instance, EmptyList<ScheduleHandleCallbackProvider>.Instance, EmptyList<NamedWindowConsumerStreamSpec>.Instance, EmptyList<FilterSpecParamExprNodeForge>.Instance); }