コード例 #1
0
        public void ValidateAddIndexAssignUpdateStrategies(string createIndexStatementName, IndexMultiKey imk, string indexName)
        {
            // add index - for now
            _eventTableIndexMetadataRepo.AddIndex(false, imk, indexName, createIndexStatementName, true);

            // validate strategies, rollback if required
            foreach (var stmtEntry in _stmtNameToUpdateStrategyReceivers)
            {
                foreach (var strategyReceiver in stmtEntry.Value)
                {
                    try {
                        TableUpdateStrategyFactory.ValidateGetTableUpdateStrategy(this, strategyReceiver.UpdateHelper, strategyReceiver.IsOnMerge);
                    }
                    catch (ExprValidationException ex) {
                        _eventTableIndexMetadataRepo.RemoveIndex(imk);
                        throw new ExprValidationException("Failed to validate statement '" + stmtEntry.Key + "' as a recipient of the proposed index: " + ex.Message);
                    }
                }
            }

            // assign new strategies
            foreach (var stmtEntry in _stmtNameToUpdateStrategyReceivers)
            {
                foreach (var strategyReceiver in stmtEntry.Value)
                {
                    var strategy = TableUpdateStrategyFactory.ValidateGetTableUpdateStrategy(this, strategyReceiver.UpdateHelper, strategyReceiver.IsOnMerge);
                    strategyReceiver.Receiver.Update(strategy);
                }
            }
        }
コード例 #2
0
 public void InitTableUpdateStrategy(Table table)
 {
     try {
         TableUpdateStrategy =
             TableUpdateStrategyFactory.ValidateGetTableUpdateStrategy(table.MetaData, UpdateHelperTable, false);
     }
     catch (ExprValidationException ex) {
         throw new EPException(ex.Message, ex);
     }
 }
コード例 #3
0
 public void InitTableUpdateStrategy(Table table)
 {
     try {
         tableUpdateStrategy = TableUpdateStrategyFactory.ValidateGetTableUpdateStrategy(
             table.MetaData,
             tableUpdate,
             true);
     }
     catch (ExprValidationException e) {
         throw new EPException(e.Message, e);
     }
 }
コード例 #4
0
 public TableUpdateStrategy GetTableUpdateStrategy(TableMetadata tableMetadata, EventBeanUpdateHelper updateHelper, bool isOnMerge)
 {
     return(TableUpdateStrategyFactory.ValidateGetTableUpdateStrategy(tableMetadata, updateHelper, isOnMerge));
 }
コード例 #5
0
        public InfraOnMergeHelperForge(
            OnTriggerMergeDesc onTriggerDesc,
            EventType triggeringEventType,
            string triggeringStreamName,
            string infraName,
            EventTypeSPI infraEventType,
            StatementRawInfo statementRawInfo,
            StatementCompileTimeServices services,
            TableMetaData table)
        {
            matched = new List<InfraOnMergeMatchForge>();
            unmatched = new List<InfraOnMergeMatchForge>();

            var count = 1;
            var hasDeleteAction = false;
            var hasInsertIntoTableAction = false;
            var hasUpdateAction = false;

            foreach (var matchedItem in onTriggerDesc.Items) {
                IList<InfraOnMergeActionForge> actions = new List<InfraOnMergeActionForge>();
                foreach (OnTriggerMergeAction item in matchedItem.Actions) {
                    try {
                        if (item is OnTriggerMergeActionInsert) {
                            var insertDesc = (OnTriggerMergeActionInsert) item;
                            var forge = SetupInsert(
                                infraName,
                                infraEventType,
                                insertDesc,
                                triggeringEventType,
                                triggeringStreamName,
                                statementRawInfo,
                                services,
                                table != null);
                            actions.Add(forge);
                            hasInsertIntoTableAction = forge.InsertIntoTable != null;
                        }
                        else if (item is OnTriggerMergeActionUpdate) {
                            var updateDesc = (OnTriggerMergeActionUpdate) item;
                            EventBeanUpdateHelperForge updateHelper = EventBeanUpdateHelperForgeFactory.Make(
                                infraName,
                                infraEventType,
                                updateDesc.Assignments,
                                onTriggerDesc.OptionalAsName,
                                triggeringEventType,
                                true,
                                statementRawInfo.StatementName,
                                services.EventTypeAvroHandler);
                            ExprNode filterEval = updateDesc.OptionalWhereClause;
                            if (table != null) {
                                TableUpdateStrategyFactory.ValidateTableUpdateOnMerge(
                                    table,
                                    updateHelper.UpdateItemsPropertyNames);
                            }

                            var forge = new InfraOnMergeActionUpdForge(filterEval, updateHelper, table);
                            actions.Add(forge);
                            hasUpdateAction = true;
                        }
                        else if (item is OnTriggerMergeActionDelete) {
                            var deleteDesc = (OnTriggerMergeActionDelete) item;
                            ExprNode filterEval = deleteDesc.OptionalWhereClause;
                            actions.Add(new InfraOnMergeActionDelForge(filterEval));
                            hasDeleteAction = true;
                        }
                        else {
                            throw new ArgumentException("Invalid type of merge item '" + item.GetType() + "'");
                        }

                        count++;
                    }
                    catch (Exception ex) when (ex is ExprValidationException || ex is EPException) {
                        var isNot = item is OnTriggerMergeActionInsert;
                        var message = "Validation failed in when-" +
                                      (isNot ? "not-" : "") +
                                      "matched (clause " +
                                      count +
                                      "): " +
                                      ex.Message;
                        throw new ExprValidationException(message, ex);
                    }
                }

                if (matchedItem.IsMatchedUnmatched) {
                    matched.Add(new InfraOnMergeMatchForge(matchedItem.OptionalMatchCond, actions));
                }
                else {
                    unmatched.Add(new InfraOnMergeMatchForge(matchedItem.OptionalMatchCond, actions));
                }
            }

            if (onTriggerDesc.OptionalInsertNoMatch != null) {
                insertUnmatched = SetupInsert(
                    infraName,
                    infraEventType,
                    onTriggerDesc.OptionalInsertNoMatch,
                    triggeringEventType,
                    triggeringStreamName,
                    statementRawInfo,
                    services,
                    table != null);
            }

            requiresTableWriteLock = hasDeleteAction || hasInsertIntoTableAction || hasUpdateAction;
        }