internal void Compile() { _assembly = new GeneratedAssembly(new GenerationRules("Marten.Generated")); _assembly.Generation.Assemblies.Add(GetType().Assembly); _assembly.Generation.Assemblies.AddRange(_projectMethods.ReferencedAssemblies()); _assembly.Generation.Assemblies.AddRange(_createMethods.ReferencedAssemblies()); _assembly.Namespaces.Add("System.Linq"); _isAsync = _createMethods.IsAsync || _projectMethods.IsAsync; var baseType = _isAsync ? typeof(AsyncEventProjection <>) : typeof(SyncEventProjection <>); baseType = baseType.MakeGenericType(GetType()); _inlineType = _assembly.AddType(GetType().Name.Sanitize() + "GeneratedInlineProjection", baseType); var method = _inlineType.MethodFor("ApplyEvent"); method.DerivedVariables.Add(new Variable(GetType(), "Projection")); var eventHandling = MethodCollection.AddEventHandling(null, null, _createMethods, _projectMethods); method.Frames.Add(eventHandling); var assemblyGenerator = new AssemblyGenerator(); assemblyGenerator.ReferenceAssembly(typeof(IMartenSession).Assembly); assemblyGenerator.Compile(_assembly); }
private GeneratedMethod buildDetermineOperationMethod() { var method = _inlineType.MethodFor(nameof(AggregationRuntime <string, string> .DetermineOperation)); // This gets you the EventSlice aggregate Id method.DerivedVariables.Add(new Variable(_aggregateMapping.IdType, $"slice.{nameof(EventSlice<string, string>.Id)}")); method.DerivedVariables.Add(Variable.For <ITenant>($"slice.{nameof(EventSlice<string, string>.Tenant)}")); method.DerivedVariables.Add(Variable.For <ITenant>($"slice.{nameof(EventSlice<string, string>.Tenant)}")); method.DerivedVariables.Add(Variable.For <IEvent>("@event")); method.DerivedVariables.Add(Variable.For <IMartenSession>($"({typeof(IMartenSession).FullNameInCode()})session")); method.DerivedVariables.Add(Variable.For <IQuerySession>("session")); method.DerivedVariables.Add( Variable.For <IAggregateProjection>(nameof(AggregationRuntime <string, string> .Projection))); var createFrame = new CallCreateAggregateFrame(_createMethods); method.Frames.Add(new InitializeLiveAggregateFrame(typeof(T), _aggregateMapping.IdType, createFrame)); method.Frames.Add(new MethodCall(_storageType, "SetIdentity")); var handlers = MethodCollection.AddEventHandling(typeof(T), _aggregateMapping, _applyMethods, _shouldDeleteMethods); var iterate = new ForEachEventFrame((IReadOnlyList <Frame>)handlers); method.Frames.Add(iterate); return(method); }
private void buildInlineAggregationType() { var inlineBaseType = typeof(InlineAggregationBase <,>).MakeGenericType(typeof(T), _aggregateMapping.IdType); _inlineType = _assembly.AddType(GetType().NameInCode().Sanitize() + "InlineHandler", inlineBaseType); _createMethods.BuildCreateMethod(_inlineType, _aggregateMapping); _inlineType.AllInjectedFields.Add(new InjectedField(_storageType)); _inlineType.AllInjectedFields.Add(new InjectedField(GetType())); var method = _inlineType.MethodFor(nameof(InlineAggregationBase <string, string> .DetermineOperation)); // This gets you the EventSlice aggregate Id method.DerivedVariables.Add(Variable.For <Guid>($"slice.{nameof(EventSlice<string, string>.Id)}")); method.DerivedVariables.Add(Variable.For <string>($"slice.{nameof(EventSlice<string, string>.Id)}")); // TODO -- this is hokey. Just pass in ITenant? method.DerivedVariables.Add(Variable.For <ITenant>($"(({typeof(IMartenSession).FullNameInCode()})session).{nameof(IMartenSession.Tenant)}")); method.DerivedVariables.Add(Variable.For <IEvent>("@event")); method.DerivedVariables.Add(Variable.For <IMartenSession>($"({typeof(IMartenSession).FullNameInCode()})session")); method.DerivedVariables.Add(Variable.For <IQuerySession>("session")); method.DerivedVariables.Add(Variable.For <IAggregateProjection>(nameof(InlineAggregationBase <string, string> .Projection))); var sliceType = typeof(EventSlice <,>).MakeGenericType(_aggregateMapping.DocumentType, _aggregateMapping.IdType); if (DeleteEvents.Any()) { method.Frames.Code($"if (Projection.{nameof(MatchesAnyDeleteType)}({{0}})) return {{1}}.{nameof(IDocumentStorage<string, string>.DeleteForId)}({{2}});", new Use(sliceType), new Use(_storageType), new Use(_aggregateMapping.IdType)); } var createFrame = new CallCreateAggregateFrame(_createMethods); method.Frames.Add(new InitializeLiveAggregateFrame(typeof(T), _aggregateMapping.IdType, createFrame)); method.Frames.Add(new MethodCall(_storageType, "SetIdentity")); var handlers = MethodCollection.AddEventHandling(typeof(T), _aggregateMapping, _applyMethods, _shouldDeleteMethods); var iterate = new ForEachEventFrame((IReadOnlyList <Frame>)handlers); method.Frames.Add(iterate); var upsertMethod = typeof(IDocumentStorage <>).MakeGenericType(typeof(T)).GetMethod("Upsert"); var upsert = new MethodCall(_storageType, upsertMethod) { ReturnAction = ReturnAction.Return }; method.Frames.Add(upsert); _inlineType.Setters.AddRange(_applyMethods.Setters()); _inlineType.Setters.AddRange(_createMethods.Setters()); _inlineType.Setters.AddRange(_shouldDeleteMethods.Setters()); }
private void buildDetermineOperationMethodForDaemonRunner(bool daemonBuilderIsAsync) { var methodName = daemonBuilderIsAsync ? "DetermineOperation" : "DetermineOperationSync"; var method = _asyncDaemonType.MethodFor(methodName); if (daemonBuilderIsAsync) { method.AsyncMode = AsyncMode.AsyncTask; } method.DerivedVariables.Add(Variable.For <ITenant>($"fragment.{nameof(StreamFragment<string, string>.Tenant)}")); method.DerivedVariables.Add(Variable.For <IEvent>("@event")); method.DerivedVariables.Add(Variable.For <IQuerySession>($"(({typeof(IQuerySession).FullNameInCode()})session)")); // At most, only one of these would be used method.DerivedVariables.Add(Variable.For <Guid>($"fragment.Id")); method.DerivedVariables.Add(Variable.For <string>($"fragment.Id")); var aggregate = new Variable(typeof(T), $"fragment.{nameof(StreamFragment<string, string>.Aggregate)}"); method.DerivedVariables.Add(aggregate); var createFrame = new CallCreateAggregateFrame(_createMethods, aggregate) { FirstEventExpression = $"fragment.{nameof(StreamFragment<string, string>.Events)}[0]", Action = CreateAggregateAction.NullCoalesce }; method.Frames.Add(createFrame); method.Frames.Add(new MethodCall(_storageType, "SetIdentity")); var handlers = MethodCollection.AddEventHandling(typeof(T), _aggregateMapping, _applyMethods, _shouldDeleteMethods); var iterate = new ForEachEventFrame((IReadOnlyList <Frame>)handlers) { EventIteration = "fragment.Events" }; method.Frames.Add(iterate); var upsertMethod = typeof(IDocumentStorage <>).MakeGenericType(typeof(T)).GetMethod("Upsert"); var upsert = new MethodCall(_storageType, upsertMethod) { ReturnAction = ReturnAction.Return }; method.Frames.Add(upsert); }
protected override void assembleTypes(GeneratedAssembly assembly, StoreOptions options) { assembly.Rules.Assemblies.Add(GetType().Assembly); assembly.Rules.Assemblies.AddRange(_projectMethods.ReferencedAssemblies()); assembly.Rules.Assemblies.AddRange(_createMethods.ReferencedAssemblies()); assembly.UsingNamespaces.Add("System.Linq"); _isAsync = _createMethods.IsAsync || _projectMethods.IsAsync; var baseType = _isAsync ? typeof(AsyncEventProjection <>) : typeof(SyncEventProjection <>); baseType = baseType.MakeGenericType(GetType()); _inlineType = assembly.AddType(_inlineTypeName, baseType); var method = _inlineType.MethodFor("ApplyEvent"); method.DerivedVariables.Add(new Variable(GetType(), "Projection")); var eventHandling = MethodCollection.AddEventHandling(null, null, _createMethods, _projectMethods); method.Frames.Add(eventHandling); }