/**
   * Ctor.
   *
   * @param revisionEventTypeName name
   * @param spec specification
   * @param statementStopService for stop handling
   * @param eventAdapterService for nested property handling
   */
  public VAERevisionProcessorDeclared(
      String revisionEventTypeName,
      RevisionSpec spec,
      StatementStopService statementStopService,
      EventAdapterService eventAdapterService,
      EventTypeIdGenerator eventTypeIdGenerator) {
    super(spec, revisionEventTypeName, eventAdapterService);

    // on statement stop, remove versions
    statementStopService.addSubscriber(
        new StatementStopCallback() {
          public void statementStopped() {
            statePerKey.clear();
          }
        });

    this.statePerKey = new HashMap<MultiKeyUntyped, RevisionStateDeclared>();
    this.baseEventType = spec.getBaseEventType();
    this.fullKeyGetters = PropertyUtility.getGetters(baseEventType, spec.getKeyPropertyNames());

    // sort non-key properties, removing keys
    groups =
        PropertyUtility.analyzeGroups(
            spec.getChangesetPropertyNames(), spec.getDeltaTypes(), spec.getDeltaNames());
    Map<String, RevisionPropertyTypeDesc> propertyDesc = createPropertyDescriptors(spec, groups);

    typeDescriptors =
        PropertyUtility.getPerType(
            groups, spec.getChangesetPropertyNames(), spec.getKeyPropertyNames());
    EventTypeMetadata metadata =
        EventTypeMetadata.createValueAdd(
            revisionEventTypeName, EventTypeMetadata.TypeClass.REVISION);
    revisionEventType =
        new RevisionEventType(
            metadata,
            eventTypeIdGenerator.getTypeId(revisionEventTypeName),
            propertyDesc,
            eventAdapterService);
  }
Exemplo n.º 2
0
  private TableOnMergeActionIns setupInsert(
      TableMetadata tableMetadata,
      InternalEventRouter internalEventRouter,
      int selectClauseNumber,
      OnTriggerMergeActionInsert desc,
      EventType triggeringEventType,
      String triggeringStreamName,
      StatementContext statementContext)
      throws ExprValidationException {

    // Compile insert-into info
    String streamName =
        desc.getOptionalStreamName() != null
            ? desc.getOptionalStreamName()
            : tableMetadata.getTableName();
    InsertIntoDesc insertIntoDesc = InsertIntoDesc.fromColumns(streamName, desc.getColumns());
    EventType insertIntoTargetType =
        streamName.equals(tableMetadata.getTableName())
            ? tableMetadata.getInternalEventType()
            : null;

    // rewrite any wildcards to use "stream.wildcard"
    if (triggeringStreamName == null) {
      triggeringStreamName = UuidGenerator.generate();
    }
    List<SelectClauseElementCompiled> selectNoWildcard =
        NamedWindowOnMergeHelper.compileSelectNoWildcard(
            triggeringStreamName, desc.getSelectClauseCompiled());

    // Set up event types for select-clause evaluation: The first type does not contain anything as
    // its the named window row which is not present for insert
    EventType dummyTypeNoProperties =
        new MapEventType(
            EventTypeMetadata.createAnonymous("merge_named_window_insert"),
            "merge_named_window_insert",
            0,
            null,
            Collections.<String, Object>emptyMap(),
            null,
            null,
            null);
    EventType[] eventTypes = new EventType[] {dummyTypeNoProperties, triggeringEventType};
    String[] streamNames = new String[] {UuidGenerator.generate(), triggeringStreamName};
    StreamTypeService streamTypeService =
        new StreamTypeServiceImpl(
            eventTypes, streamNames, new boolean[1], statementContext.getEngineURI(), false);

    // Get select expr processor
    SelectExprEventTypeRegistry selectExprEventTypeRegistry =
        new SelectExprEventTypeRegistry(
            statementContext.getStatementName(), statementContext.getStatementEventTypeRef());
    ExprEvaluatorContextStatement exprEvaluatorContext =
        new ExprEvaluatorContextStatement(statementContext, false);
    SelectExprProcessor insertHelper =
        SelectExprProcessorFactory.getProcessor(
            Collections.singleton(selectClauseNumber),
            selectNoWildcard.toArray(new SelectClauseElementCompiled[selectNoWildcard.size()]),
            false,
            insertIntoDesc,
            insertIntoTargetType,
            null,
            streamTypeService,
            statementContext.getEventAdapterService(),
            statementContext.getStatementResultService(),
            statementContext.getValueAddEventService(),
            selectExprEventTypeRegistry,
            statementContext.getMethodResolutionService(),
            exprEvaluatorContext,
            statementContext.getVariableService(),
            statementContext.getTableService(),
            statementContext.getTimeProvider(),
            statementContext.getEngineURI(),
            statementContext.getStatementId(),
            statementContext.getStatementName(),
            statementContext.getAnnotations(),
            statementContext.getContextDescriptor(),
            statementContext.getConfigSnapshot(),
            null,
            statementContext.getNamedWindowService(),
            null);
    ExprEvaluator filterEval =
        desc.getOptionalWhereClause() == null
            ? null
            : desc.getOptionalWhereClause().getExprEvaluator();

    InternalEventRouter routerToUser =
        streamName.equals(tableMetadata.getTableName()) ? null : internalEventRouter;
    boolean audit = AuditEnum.INSERT.getAudit(statementContext.getAnnotations()) != null;
    return new TableOnMergeActionIns(
        filterEval,
        insertHelper,
        routerToUser,
        statementContext.getEpStatementHandle(),
        statementContext.getInternalEventEngineRouteDest(),
        audit,
        tableMetadata.getRowFactory());
  }