コード例 #1
0
        public LogicConditionalTriggerInstanceInfo(InlineTrigger trigger, InstanceInfo parent, IEngineContext context, IStorage parentStorage)
            : base(context.Logger)
        {
            _context   = context;
            _parent    = parent;
            _trigger   = trigger;
            _condition = trigger.Condition;

            var dataResolversFactory = context.DataResolversFactory;

            _searcher = dataResolversFactory.GetLogicalSearchResolver();

            _localCodeExecutionContext = new LocalCodeExecutionContext();
            var localStorageSettings = RealStorageSettingsHelper.Create(context, parentStorage);

            _storage = new LocalStorage(localStorageSettings);
            _localCodeExecutionContext.Storage = _storage;

            _localCodeExecutionContext.Holder = parent.Name;

            _storage.LogicalStorage.OnChangedWithKeys += LogicalStorage_OnChangedWithKeys;

            lock (_lockObj)
            {
                DoSearch();
            }
        }
コード例 #2
0
        public InstanceInfo(StrongIdentifierValue name, IEngineContext context, IStorage parentStorage)
            : base(context.Logger)
        {
            Name     = name;
            _context = context;

            _localCodeExecutionContext = new LocalCodeExecutionContext();
            var localStorageSettings = RealStorageSettingsHelper.Create(context, parentStorage);

            _storage = new LocalStorage(localStorageSettings);
            _localCodeExecutionContext.Storage = _storage;
            _localCodeExecutionContext.Holder  = Name;

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

            _triggersResolver = new TriggersResolver(context);
        }
コード例 #3
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;
        }
コード例 #4
0
        private CodeFrame ConvertExecutableToCodeFrame(IExecutable function,
                                                       KindOfFunctionParameters kindOfParameters, Dictionary <StrongIdentifierValue, Value> namedParameters, List <Value> positionedParameters)
        {
#if DEBUG
            //Log($"kindOfParameters = {kindOfParameters}");
            //Log($"namedParameters = {namedParameters.WriteDict_1_ToString()}");
            //Log($"positionedParameters = {positionedParameters.WriteListToString()}");
#endif

            var currentLocalContext = _currentCodeFrame.LocalContext;

            var storagesList = currentLocalContext.Storage.GetStorages();

#if DEBUG
            //Log($"storagesList.Count = {storagesList.Count}");
            //foreach(var tmpStorage in storagesList)
            //{
            //    Log($"tmpStorage = {tmpStorage}");
            //}
#endif

            var localCodeExecutionContext = new LocalCodeExecutionContext();
            var localStorageSettings      = RealStorageSettingsHelper.Create(_context, storagesList.ToList());

            var newStorage = new LocalStorage(localStorageSettings);

            localCodeExecutionContext.Storage = newStorage;

            switch (kindOfParameters)
            {
            case KindOfFunctionParameters.NoParameters:
                if (function.Arguments.Any())
                {
                    throw new NotImplementedException();
                }
                break;

            case KindOfFunctionParameters.PositionedParameters:
                FillUpPositionedParameters(localCodeExecutionContext, function, positionedParameters);
                break;

            case KindOfFunctionParameters.NamedParameters:
                FillUpNamedParameters(localCodeExecutionContext, function, namedParameters);
                break;

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

            localCodeExecutionContext.Holder = currentLocalContext.Holder;

            var codeFrame = new CodeFrame();
            codeFrame.CompiledFunctionBody = function.CompiledFunctionBody;
            codeFrame.LocalContext         = localCodeExecutionContext;

            var processInfo = new ProcessInfo();

            codeFrame.ProcessInfo = processInfo;
            processInfo.CodeFrame = codeFrame;
            codeFrame.Metadata    = function.CodeEntity;

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

            return(codeFrame);
        }
コード例 #5
0
        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
        }