Example #1
0
        public void Init()
        {
            _instanceState = InstanceState.Initializing;

            var targetSystemEventsTriggersList = _triggersResolver.ResolveSystemEventsTriggersList(KindOfSystemEventOfInlineTrigger.Init, Name, _localCodeExecutionContext, ResolverOptions.GetDefaultOptions());

#if DEBUG
            //Log($"targetSystemEventsTriggersList = {targetSystemEventsTriggersList.WriteListToString()}");
#endif

            if (targetSystemEventsTriggersList.Any())
            {
                targetSystemEventsTriggersList.Reverse();

                var processInitialInfoList = new List <ProcessInitialInfo>();

                foreach (var targetTrigger in targetSystemEventsTriggersList)
                {
                    var localCodeExecutionContext = new LocalCodeExecutionContext();

                    var localStorageSettings = RealStorageSettingsHelper.Create(_context, _storage);
                    localCodeExecutionContext.Storage = new LocalStorage(localStorageSettings);

                    localCodeExecutionContext.Holder = Name;

                    var processInitialInfo = new ProcessInitialInfo();
                    processInitialInfo.CompiledFunctionBody = targetTrigger.ResultItem.CompiledFunctionBody;
                    processInitialInfo.LocalContext         = localCodeExecutionContext;
                    processInitialInfo.Metadata             = targetTrigger.ResultItem.CodeEntity;

                    processInitialInfoList.Add(processInitialInfo);
                }

#if DEBUG
                //Log($"processInitialInfoList = {processInitialInfoList.WriteListToString()}");
#endif

                var taskValue = _context.CodeExecutor.ExecuteBatchAsync(processInitialInfoList);

#if DEBUG
                //Log($"taskValue = {taskValue}");
#endif
            }

            var targetLogicConditionalTriggersList = _triggersResolver.ResolveLogicConditionalTriggersList(Name, _localCodeExecutionContext, ResolverOptions.GetDefaultOptions());

#if DEBUG
            //Log($"targetLogicConditionalTriggersList = {targetLogicConditionalTriggersList.WriteListToString()}");
#endif

            if (targetLogicConditionalTriggersList.Any())
            {
                foreach (var targetTrigger in targetLogicConditionalTriggersList)
                {
#if DEBUG
                    //Log($"targetTrigger = {targetTrigger}");
#endif

                    var triggerInstanceInfo = new LogicConditionalTriggerInstanceInfo(targetTrigger.ResultItem, this, _context, _storage);
                    _logicConditionalTriggersList.Add(triggerInstanceInfo);
                }
            }

            _instanceState = InstanceState.Initialized;
        }
        private void DoSearch()
        {
            var searchOptions = new LogicalSearchOptions();

            searchOptions.QueryExpression           = _condition;
            searchOptions.LocalCodeExecutionContext = _localCodeExecutionContext;

#if DEBUG
            //Log($"searchOptions = {searchOptions}");
#endif

            var searchResult = _searcher.Run(searchOptions);

#if DEBUG
            //Log($"searchResult = {searchResult}");
            //Log($"result = {DebugHelperForLogicalSearchResult.ToString(searchResult)}");
            //foreach(var usedKey in searchResult.UsedKeysList)
            //{
            //    Log($"usedKey = {usedKey}");
            //    Log($"_context.Dictionary.GetName(usedKey) = {_context.Dictionary.GetName(usedKey)}");
            //}
#endif

            _usedKeysList = searchResult.UsedKeysList;

#if DEBUG
            //Log($"_isOn = {_isOn}");
#endif

            if (_isOn)
            {
                if (!searchResult.IsSuccess)
                {
                    _isOn = false;
                }
            }
            else
            {
                if (searchResult.IsSuccess)
                {
                    _isOn = true;

#if DEBUG
                    //Log($"searchResult = {searchResult}");
                    //Log($"result = {DebugHelperForLogicalSearchResult.ToString(searchResult)}");
#endif

                    var localCodeExecutionContext = new LocalCodeExecutionContext();
                    var localStorageSettings      = RealStorageSettingsHelper.Create(_context, _storage);
                    var storage = new LocalStorage(localStorageSettings);
                    localCodeExecutionContext.Storage = storage;
                    localCodeExecutionContext.Holder  = _parent.Name;

                    var varStorage = storage.VarStorage;

                    var bindingVariables = _trigger.BindingVariables;

                    if (bindingVariables.Any())
                    {
                        var foundResultItem = searchResult.Items.FirstOrDefault();

                        if (foundResultItem == null)
                        {
                            throw new NotImplementedException();
                        }

                        var resultVarsList = foundResultItem.ResultOfVarOfQueryToRelationList;

#if DEBUG
                        //Log($"resultVarsList.Count = {resultVarsList.Count}");
#endif

                        if (bindingVariables.Count != resultVarsList.Count)
                        {
                            throw new NotImplementedException();
                        }

                        foreach (var resultVar in resultVarsList)
                        {
#if DEBUG
                            //Log($"resultVar = {resultVar}");
#endif

                            Value value = null;

                            var foundExpression = resultVar.FoundExpression;

                            var kindOfFoundExpression = foundExpression.Kind;

                            switch (kindOfFoundExpression)
                            {
                            case KindOfLogicalQueryNode.Entity:
                                value = foundExpression.Name;
                                break;

                            case KindOfLogicalQueryNode.Value:
                                value = foundExpression.Value;
                                break;

                            default:
                                throw new ArgumentOutOfRangeException(nameof(kindOfFoundExpression), kindOfFoundExpression, null);
                            }

#if DEBUG
                            //Log($"value = {value}");
#endif

                            var destVar = bindingVariables.GetDest(resultVar.NameOfVar);

#if DEBUG
                            //Log($"destVar = {destVar}");
#endif

                            varStorage.SetValue(destVar, value);
                        }
                    }

                    var processInitialInfo = new ProcessInitialInfo();
                    processInitialInfo.CompiledFunctionBody = _trigger.CompiledFunctionBody;
                    processInitialInfo.LocalContext         = localCodeExecutionContext;
                    processInitialInfo.Metadata             = _trigger.CodeEntity;

                    var task = _context.CodeExecutor.ExecuteAsync(processInitialInfo);
                }
            }

#if DEBUG
            //Log($"_isOn (after) = {_isOn}");
#endif
        }