public SelectExprProcessorDescriptor( SelectSubscriberDescriptor subscriberDescriptor, SelectExprProcessorForge forge, IList<StmtClassForgeableFactory> additionalForgeables) { SubscriberDescriptor = subscriberDescriptor; Forge = forge; AdditionalForgeables = additionalForgeables; }
public static SelectExprProcessorDescriptor GetProcessor( SelectProcessorArgs args, InsertIntoDesc insertIntoDesc, bool withSubscriber) { IList<StmtClassForgeableFactory> additionalForgeables = new List<StmtClassForgeableFactory>(); SelectExprProcessorWInsertTarget synthetic = GetProcessorInternal(args, insertIntoDesc); additionalForgeables.AddAll(synthetic.AdditionalForgeables); // plan serdes for variant event types if (synthetic.InsertIntoTargetType is VariantEventType || synthetic.InsertIntoTargetType is WrapperEventType && (((WrapperEventType) synthetic.InsertIntoTargetType).UnderlyingEventType is VariantEventType)) { var serdeForgeables = SerdeEventTypeUtility.Plan( synthetic.Forge.ResultEventType, args.StatementRawInfo, args.CompileTimeServices.SerdeEventTypeRegistry, args.CompileTimeServices.SerdeResolver); additionalForgeables.AddAll(serdeForgeables); foreach (EventType eventType in args.TypeService.EventTypes) { serdeForgeables = SerdeEventTypeUtility.Plan( eventType, args.StatementRawInfo, args.CompileTimeServices.SerdeEventTypeRegistry, args.CompileTimeServices.SerdeResolver); additionalForgeables.AddAll(serdeForgeables); } } if (args.IsFireAndForget || !withSubscriber) { return new SelectExprProcessorDescriptor(new SelectSubscriberDescriptor(), synthetic.Forge, additionalForgeables); } // Handle for-clause delivery contract checking ExprNode[] groupedDeliveryExpr = null; MultiKeyClassRef groupedDeliveryMultiKey = null; var forDelivery = false; if (args.ForClauseSpec != null) { foreach (var item in args.ForClauseSpec.Clauses) { if (item.Keyword == null) { throw new ExprValidationException( "Expected any of the " + EnumHelper.GetValues<ForClauseKeyword>().RenderAny().ToLowerInvariant() + " for-clause keywords after reserved keyword 'for'"); } try { var keyword = EnumHelper.Parse<ForClauseKeyword>(item.Keyword); if (keyword == ForClauseKeyword.GROUPED_DELIVERY && item.Expressions.IsEmpty()) { throw new ExprValidationException( "The for-clause with the " + ForClauseKeyword.GROUPED_DELIVERY.GetName() + " keyword requires one or more grouping expressions"); } if (keyword == ForClauseKeyword.DISCRETE_DELIVERY && !item.Expressions.IsEmpty()) { throw new ExprValidationException( "The for-clause with the " + ForClauseKeyword.DISCRETE_DELIVERY.GetName() + " keyword does not allow grouping expressions"); } if (forDelivery) { throw new ExprValidationException( "The for-clause with delivery keywords may only occur once in a statement"); } } catch (ExprValidationException) { throw; } catch (EPException) { throw; } catch (Exception) { throw new ExprValidationException( "Expected any of the " + EnumHelper.GetValues<ForClauseKeyword>().RenderAny().ToLowerInvariant() + " for-clause keywords after reserved keyword 'for'"); } StreamTypeService type = new StreamTypeServiceImpl(synthetic.Forge.ResultEventType, null, false); groupedDeliveryExpr = new ExprNode[item.Expressions.Count]; var validationContext = new ExprValidationContextBuilder( type, args.StatementRawInfo, args.CompileTimeServices) .WithAllowBindingConsumption(true) .Build(); for (var i = 0; i < item.Expressions.Count; i++) { groupedDeliveryExpr[i] = ExprNodeUtilityValidate.GetValidatedSubtree( ExprNodeOrigin.FORCLAUSE, item.Expressions[i], validationContext); } forDelivery = true; MultiKeyPlan multiKeyPlan = MultiKeyPlanner.PlanMultiKey( groupedDeliveryExpr, false, args.StatementRawInfo, args.SerdeResolver); groupedDeliveryMultiKey = multiKeyPlan.ClassRef; additionalForgeables = multiKeyPlan.MultiKeyForgeables; } if (groupedDeliveryExpr != null && groupedDeliveryExpr.Length == 0) { groupedDeliveryExpr = null; } } var allowSubscriber = args.CompileTimeServices.Configuration.Compiler.ByteCode.IsAllowSubscriber; SelectSubscriberDescriptor descriptor; SelectExprProcessorForge forge; if (allowSubscriber) { BindProcessorForge bindProcessor = new BindProcessorForge( synthetic.Forge, args.SelectionList, args.TypeService.EventTypes, args.TypeService.StreamNames, args.TableCompileTimeResolver); descriptor = new SelectSubscriberDescriptor( bindProcessor.ExpressionTypes, bindProcessor.ColumnNamesAssigned, forDelivery, groupedDeliveryExpr, groupedDeliveryMultiKey); forge = new BindSelectExprProcessorForge(synthetic.Forge, bindProcessor); } else { descriptor = new SelectSubscriberDescriptor(); forge = new ListenerOnlySelectExprProcessorForge(synthetic.Forge); } return new SelectExprProcessorDescriptor(descriptor, forge, additionalForgeables); }