Example #1
0
        public void Run()
        {
            _logger.Info("Begin");

            var context = TstEngineContextHelper.CreateAndInitContext().EngineContext;

            var defaultSettings = new DefaultSettingsOfCodeEntity();

            defaultSettings.Holder = NameHelper.CreateName("Tor");

            _logger.Info($"defaultSettings = {defaultSettings}");

            var applicationInheritanceItem = new InheritanceItem()
            {
                IsSystemDefined = true
            };

            applicationInheritanceItem.SubName   = NameHelper.CreateName("PeaseKeeper");
            applicationInheritanceItem.SuperName = context.CommonNamesStorage.AppName;
            applicationInheritanceItem.Rank      = new LogicalValue(1.0F);

            _logger.Info($"applicationInheritanceItem (1) = {applicationInheritanceItem}");

            DefaultSettingsOfCodeEntityHelper.SetUpInheritanceItem(applicationInheritanceItem, defaultSettings);

            _logger.Info($"applicationInheritanceItem (2) = {applicationInheritanceItem}");

            _logger.Info("End");
        }
        protected InheritanceItem CreateInheritanceItem()
        {
            var result = new InheritanceItem();

            DefaultSettingsOfCodeEntityHelper.SetUpInheritanceItem(result, CurrentDefaultSetings);
            return(result);
        }
Example #3
0
 private void TryCreateCurrentItem()
 {
     if (_currentItem == null)
     {
         _currentItem = CreateInheritanceItem();
         Result.Add(_currentItem);
         _currentItem.SubName = _subName;
     }
 }
        /// <inheritdoc/>
        public void RemoveInheritance(InheritanceItem inheritanceItem)
        {
            lock (_lockObj)
            {
#if DEBUG
                //Log($"kind = {_kind}");
                //Log($"subItem = {subItem}; superName = {inheritanceItem.SuperName}");
                //Log($"inheritanceItem = {inheritanceItem}");
                //Log($"isPrimary = {isPrimary}");
#endif
                //var indexedInheritanceItem = inheritanceItem.GetIndexed(_realStorageContext.MainStorageContext);

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

                var subName   = inheritanceItem.SubName;
                var superName = inheritanceItem.SuperName;

                if (subName.IsEmpty || superName.IsEmpty)
                {
                    return;
                }

                //var subNameNormalizedNameValue = subName.NormalizedNameValue;
                //var superNameNormalizedNameValue = superName.NormalizedNameValue;

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

                if (_nonIndexedInfo.ContainsKey(subName))
                {
                    var dict = _nonIndexedInfo[subName];


                    if (dict.ContainsKey(superName))
                    {
                        //var indexedDict = _indexedInfo[subNameKey];

                        var targetList = dict[superName];

                        targetList.Remove(inheritanceItem);

                        //var targetIndexedList = indexedDict[superNameKey];

                        //targetIndexedList.Remove(indexedInheritanceItem);

                        NRemoveIngeritanceFact(inheritanceItem);
                    }
                }
            }
        }
        private void NRemoveIngeritanceFact(InheritanceItem inheritanceItem)
        {
            lock (_factsIdRegistryLockObj)
            {
                if (_factsIdRegistry.ContainsKey(inheritanceItem))
                {
                    var factId = _factsIdRegistry[inheritanceItem];

                    _realStorageContext.LogicalStorage.RemoveById(factId);

                    _factsIdRegistry.Remove(inheritanceItem);
                }
            }
        }
        public void Run()
        {
            _logger.Log("Begin");

            var context = TstEngineContextHelper.CreateAndInitContext().EngineContext;

            //var dictionary = context.Dictionary;

            var inheritanceStorage = context.Storage.GlobalStorage.InheritanceStorage;

            var subName   = NameHelper.CreateName("SubClass");
            var superName = NameHelper.CreateName("SuperClass");

            var inheritanceItem = new InheritanceItem();

            inheritanceItem.SubName   = subName;
            inheritanceItem.SuperName = superName;
            inheritanceItem.Rank      = new LogicalValue(1);

            _logger.Log($"inheritanceItem = {inheritanceItem}");

            inheritanceStorage.SetInheritance(inheritanceItem);

            inheritanceItem           = new InheritanceItem();
            inheritanceItem.SubName   = subName;
            inheritanceItem.SuperName = superName;
            inheritanceItem.Rank      = new LogicalValue(0.5F);

            _logger.Log($"inheritanceItem = {inheritanceItem}");

            inheritanceStorage.SetInheritance(inheritanceItem);

            inheritanceItem           = new InheritanceItem();
            inheritanceItem.SubName   = subName;
            inheritanceItem.SuperName = superName;
            inheritanceItem.Rank      = new LogicalValue(0);

            _logger.Log($"inheritanceItem = {inheritanceItem}");

            inheritanceStorage.SetInheritance(inheritanceItem);

            var list = inheritanceStorage.GetItemsDirectly(subName);

            _logger.Log($"list.Count = {list.Count}");
            _logger.Log($"inheritanceItem = {list.WriteListToString()}");

            _logger.Log("End");
        }
Example #7
0
        private void ParseQueryStringAndGetInheritanceInformation(string queryStr)
        {
            _logger.Log($"queryStr = {queryStr}");

            var result = new CodeFile();

            result.IsMain   = false;
            result.FileName = "Hi!";

            var internalParserContext = new InternalParserContext(queryStr, result, _context);

            var globalStorage = _context.Storage.GlobalStorage;

            internalParserContext.SetCurrentDefaultSetings(globalStorage.DefaultSettingsOfCodeEntity);

            var parser = new LogicalQueryParser(internalParserContext);

            parser.Run();

            var parsedQuery = parser.Result;

            _logger.Log($"parsedQuery = {parsedQuery}");

            var inheritanceRelationsList = parsedQuery.GetInheritanceRelations();

            //_logger.Log($"inheritanceRelationsList = {inheritanceRelationsList.WriteListToString()}");

            var inheritanceItemsList = new List <InheritanceItem>();

            var ruleInstanceName = parsedQuery.Name;

            foreach (var inheritanceRelation in inheritanceRelationsList)
            {
                _logger.Log($"inheritanceRelation = {inheritanceRelation}");

                var inheritanceItem = new InheritanceItem();

                inheritanceItem.SuperName = inheritanceRelation.Name;
                inheritanceItem.SubName   = inheritanceRelation.ParamsList.Single().Name;
                inheritanceItem.Rank      = new LogicalValue(1);

                inheritanceItem.KeysOfPrimaryRecords.Add(ruleInstanceName);

                inheritanceItemsList.Add(inheritanceItem);
            }

            _logger.Log($"inheritanceItemsList = {inheritanceItemsList.WriteListToString()}");
        }
        private void AddSystemDefinedSettingsToClass(CodeEntity codeEntity)
        {
            var inheritanceItem = new InheritanceItem()
            {
                IsSystemDefined = true
            };

            inheritanceItem.SubName   = codeEntity.Name;
            inheritanceItem.SuperName = _context.CommonNamesStorage.ClassName;
            inheritanceItem.Rank      = new LogicalValue(1.0F);

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

            codeEntity.InheritanceItems.Add(inheritanceItem);
        }
        private RuleInstance CreateInheritanceFact(InheritanceItem inheritanceItem)
        {
            var factName = NameHelper.CreateRuleOrFactName();

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

            var fact = new RuleInstance();
            fact.Kind = KindOfRuleInstance.Fact;
            fact.AppendAnnotations(inheritanceItem);
            fact.Name = factName;
            //fact.KeysOfPrimaryRecords.Add(inheritanceItem.Id);

            var primaryPart = new PrimaryRulePart();
            fact.PrimaryPart   = primaryPart;
            primaryPart.Parent = fact;

            var isRelation = new LogicalQueryNode();
            isRelation.Name       = NameHelper.CreateName("is");
            isRelation.Kind       = KindOfLogicalQueryNode.Relation;
            isRelation.ParamsList = new List <LogicalQueryNode>();

            primaryPart.Expression = isRelation;

            var subItemNode = new LogicalQueryNode();
            isRelation.ParamsList.Add(subItemNode);
            subItemNode.Kind = KindOfLogicalQueryNode.Concept;
            subItemNode.Name = inheritanceItem.SubName;

            var superItemNode = new LogicalQueryNode();
            isRelation.ParamsList.Add(superItemNode);
            superItemNode.Kind = KindOfLogicalQueryNode.Concept;
            superItemNode.Name = inheritanceItem.SuperName;

            var rankNode = new LogicalQueryNode();
            isRelation.ParamsList.Add(rankNode);
            rankNode.Kind  = KindOfLogicalQueryNode.Value;
            rankNode.Value = inheritanceItem.Rank;

            return(fact);
        }
Example #10
0
        private void ProcessUseNotInheritance()
        {
            var paramsList = TakePositionedParameters(4);

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

            var inheritenceItem = new InheritanceItem();
            DefaultSettingsOfCodeEntityHelper.SetUpInheritanceItem(inheritenceItem, _currentCodeFrame.LocalContext.Storage.DefaultSettingsOfCodeEntity);

            var subName = paramsList[0].AsStrongIdentifierValue;

            var superName = paramsList[1].AsStrongIdentifierValue;

#if DEBUG
            //Log($"paramsList[2] = {paramsList[2]}");
#endif

            var rank = _logicalValueLinearResolver.Resolve(paramsList[2], _currentCodeFrame.LocalContext, ResolverOptions.GetDefaultOptions(), true).Inverse();

#if DEBUG
            //Log($"subName = {subName}");
            //Log($"superName = {superName}");
            //Log($"rank = {rank}");
#endif

            inheritenceItem.SubName   = subName;
            inheritenceItem.SuperName = superName;
            inheritenceItem.Rank      = rank;

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

            _globalStorage.InheritanceStorage.SetInheritance(inheritenceItem);

            _currentCodeFrame.CurrentPosition++;
        }
Example #11
0
        protected CodeEntity CreateAndSaveEntity(CodeEntity superCodeEntity)
        {
            var result = new CodeEntity();

            result.Kind = KindOfCodeEntity.Instance;

            var newName = _context.CommonNamesStorage.SelfName;

            result.Name = newName;

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

            result.Holder = _context.CommonNamesStorage.DefaultHolder;

            var inheritanceItem = new InheritanceItem()
            {
                IsSystemDefined = true
            };

            inheritanceItem.SubName   = newName;
            inheritanceItem.SuperName = superCodeEntity.Name;
            inheritanceItem.Rank      = new LogicalValue(1.0F);

            result.InheritanceItems.Add(inheritanceItem);

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

            var globalStorage = _context.Storage.GlobalStorage;

            globalStorage.MetadataStorage.Append(result);
            globalStorage.InheritanceStorage.SetInheritance(inheritanceItem);

            return(result);
        }
Example #12
0
 /// <inheritdoc/>
 protected override void OnEnter()
 {
     Result       = new List <InheritanceItem>();
     _currentItem = null;
 }
        public static void SetUpInheritanceItem(InheritanceItem inheritanceItem, DefaultSettingsOfCodeEntity defaultSettings)
        {
            var context = new Dictionary <object, object>();

            SetUpAnnotatedItem(inheritanceItem, defaultSettings, context);
        }
Example #14
0
        public void Run()
        {
            _logger.Log("Begin");

            var context = TstEngineContextHelper.CreateAndInitContext().EngineContext;

            var applicationInheritanceItem = new InheritanceItem()
            {
                IsSystemDefined = true
            };

            applicationInheritanceItem.SubName   = NameHelper.CreateName("PeaseKeeper");
            applicationInheritanceItem.SuperName = context.CommonNamesStorage.AppName;
            applicationInheritanceItem.Rank      = new LogicalValue(1.0F);

            context.Storage.GlobalStorage.InheritanceStorage.SetInheritance(applicationInheritanceItem);

            var compiledFunctionBody = new CompiledFunctionBody();

            var strVal = new StringValue("The beatles!");

            var command = new ScriptCommand();

            command.OperationCode = OperationCode.PushVal;
            command.Value         = strVal;

            _logger.Log($"command = {command}");

            compiledFunctionBody.Commands[0] = command;

            var identifier = NameHelper.CreateName("@>log");

            command = new ScriptCommand();
            command.OperationCode = OperationCode.PushVal;
            command.Value         = identifier;
            command.Position      = 1;

            _logger.Log($"command = {command}");

            compiledFunctionBody.Commands[1] = command;


            command = new ScriptCommand();
            command.OperationCode  = OperationCode.CallBinOp;
            command.KindOfOperator = KindOfOperator.LeftRightStream;
            command.Position       = 2;

            _logger.Log($"command = {command}");

            compiledFunctionBody.Commands[2] = command;

            command = new ScriptCommand();
            command.OperationCode = OperationCode.Return;
            command.Position      = 3;

            _logger.Log($"command = {command}");

            compiledFunctionBody.Commands[3] = command;

            _logger.Log($"compiledFunctionBody = {compiledFunctionBody}");
            _logger.Log($"compiledFunctionBody = {compiledFunctionBody.ToDbgString()}");

            var codeFrame = new CodeFrame();

            codeFrame.CompiledFunctionBody = compiledFunctionBody;
            codeFrame.LocalContext         = new LocalCodeExecutionContext();
            codeFrame.LocalContext.Storage = context.Storage.GlobalStorage;
            codeFrame.LocalContext.Holder  = NameHelper.CreateName("PixKeeper");
            //codeFrame.LocalContext.Holder = new Name();

            _logger.Log($"codeFrame = {codeFrame}");
            _logger.Log($"codeFrame = {codeFrame.ToDbgString()}");

            var threadExecutor = new SyncThreadExecutor(context);

            threadExecutor.SetCodeFrame(codeFrame);

            threadExecutor.Start();

            _logger.Log("End");
        }
Example #15
0
        private void NAppend(RuleInstance ruleInstance, bool isPrimary)
        {
#if DEBUG
            //Log($"ruleInstance = {ruleInstance}");
            //Log($"isPrimary = {isPrimary}");
            //Log($"ruleInstance = {DebugHelperForRuleInstance.ToString(ruleInstance)}");
#endif

            if (_ruleInstancesList.Contains(ruleInstance))
            {
                return;
            }

            var ruleInstanceId = ruleInstance.Name.NameValue;

            if (_ruleInstancesDictById.ContainsKey(ruleInstanceId))
            {
                return;
            }

            //ruleInstance = ruleInstance.Clone();

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

            //var indexedRuleInstance = ruleInstance.GetIndexed(_realStorageContext.MainStorageContext);

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

            var ruleInstanceName = ruleInstance.Name;

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

            if (_ruleInstancesDict.ContainsKey(ruleInstanceName))
            {
                return;
            }

            var longHashCode = ruleInstance.GetLongHashCode();

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

            if (_ruleInstancesDictByHashCode.ContainsKey(longHashCode))
            {
                return;
            }

            _ruleInstancesList.Add(ruleInstance);
            _ruleInstancesDict[ruleInstanceName]       = ruleInstance;
            _ruleInstancesDictByHashCode[longHashCode] = ruleInstance;
            _ruleInstancesDictById[ruleInstanceId]     = ruleInstance;

#if DEBUG
            //Log($"ruleInstance = {DebugHelperForRuleInstance.ToString(ruleInstance)}");
            //Log($"ruleInstance.Normalized = {DebugHelperForRuleInstance.ToString(ruleInstance.Normalized)}");
#endif

            _commonPersistIndexedLogicalData.NSetIndexedRuleInstanceToIndexData(ruleInstance.Normalized);

            if (isPrimary && _kind != KindOfStorage.PublicFacts && _kind != KindOfStorage.PerceptedFacts)
            {
#if DEBUG
                //Log($"_kind = {_kind}");
#endif

                var inheritanceRelationsList = ruleInstance.GetInheritanceRelations();
                //var ruleInstanceName = ruleInstance.Name.NameValue;

                if (inheritanceRelationsList.Any())
                {
                    var inheritanceStorage = _realStorageContext.InheritanceStorage;

                    foreach (var inheritanceRelation in inheritanceRelationsList)
                    {
#if DEBUG
                        //Log($"inheritanceRelation = {inheritanceRelation}");
#endif
                        var inheritanceItem = new InheritanceItem();

                        if (inheritanceRelation.Name == NameHelper.CreateName("is"))
                        {
                            var paramsCount = inheritanceRelation.ParamsList.Count;

                            switch (paramsCount)
                            {
                            case 2:
                                inheritanceItem.SuperName = inheritanceRelation.ParamsList[1].Name;
                                inheritanceItem.SubName   = inheritanceRelation.ParamsList[0].Name;
                                inheritanceItem.Rank      = new LogicalValue(1);
                                break;

                            case 3:
                                inheritanceItem.SuperName = inheritanceRelation.ParamsList[1].Name;
                                inheritanceItem.SubName   = inheritanceRelation.ParamsList[0].Name;
                                var thirdParameter       = inheritanceRelation.ParamsList[2];
                                var kindOfthirdParameter = thirdParameter.Kind;
                                switch (kindOfthirdParameter)
                                {
                                case KindOfLogicalQueryNode.Concept:
                                    inheritanceItem.Rank = thirdParameter.Name;
                                    break;

                                case KindOfLogicalQueryNode.FuzzyLogicNonNumericSequence:
                                    inheritanceItem.Rank = thirdParameter.FuzzyLogicNonNumericSequenceValue;
                                    break;

                                case KindOfLogicalQueryNode.Value:
                                    inheritanceItem.Rank = thirdParameter.Value;
                                    break;

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

                            default:
                                throw new ArgumentOutOfRangeException(nameof(paramsCount), paramsCount, null);
                            }
                        }
                        else
                        {
                            inheritanceItem.SuperName = inheritanceRelation.Name;
                            inheritanceItem.SubName   = inheritanceRelation.ParamsList.Single().Name;
                            inheritanceItem.Rank      = new LogicalValue(1);
                        }

                        inheritanceItem.KeysOfPrimaryRecords.Add(ruleInstanceName);
#if DEBUG
                        //Log($"inheritanceItem = {inheritanceItem}");
#endif

                        inheritanceStorage.SetInheritance(inheritanceItem, false);
                    }
                }
            }

#if IMAGINE_WORKING
            //Log("End");
#else
            throw new NotImplementedException();
#endif
        }
 /// <inheritdoc/>
 public void SetInheritance(InheritanceItem inheritanceItem)
 {
     SetInheritance(inheritanceItem, true);
 }
        private void Recalculate()
        {
#if DEBUG
            //Log($"_context.Id = {_context.Id}");
            //Log($"_selfName.NameValue = {_selfName.NameValue}");
#endif

            if (_localCodeExecutionContext == null)
            {
                var commonNamesStorage = _context.CommonNamesStorage;

                _selfName         = commonNamesStorage.SelfName;
                _selfNameForFacts = NameHelper.NormalizeNameStr(_selfName.NameValue);

                _logicQueryParseAndCache = _context.LogicQueryParseAndCache;

                _localCodeExecutionContext = new LocalCodeExecutionContext()
                {
                    Storage = _context.Storage.GlobalStorage,
                    Holder  = commonNamesStorage.DefaultHolder
                };
            }

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

            var weightedInheritanceItemsList = _inheritanceResolver.GetWeightedInheritanceItems(_selfName, _localCodeExecutionContext, _resolverOptions);

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

            if (!weightedInheritanceItemsList.Any())
            {
                _foundInheritanceKeysList.Clear();
                return;
            }

            var inheritanceItemsDict = weightedInheritanceItemsList.ToDictionary(p => p.SuperName, p => p.OriginalItem);

            var idsList = weightedInheritanceItemsList.Select(p => p.SuperName).Distinct().ToList();

#if DEBUG
            //Log($"idsList = {JsonConvert.SerializeObject(idsList.Select(p => p.NameValue))}");
#endif

            var newIdsList = idsList.Except(_foundInheritanceKeysList);

#if DEBUG
            //Log($"newIdsList = {JsonConvert.SerializeObject(newIdsList.Select(p => p.NameValue))}");
#endif

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

                    var name = id.NameValue;

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

                    var initialAddedInheritanceItem = inheritanceItemsDict[id];

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

                    var factStr = $"{{: >:{{ is({_selfNameForFacts}, {name}, 1) }} :}}";

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

                    var fact = _logicQueryParseAndCache.GetLogicRuleOrFact(factStr);

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

                    _publicFactsStorage.Append(fact);

                    _factsIdDict[name] = fact.Name.NameValue;

                    var addedInheritanceItem = new InheritanceItem();

                    addedInheritanceItem.SuperName = initialAddedInheritanceItem.SuperName;
                    addedInheritanceItem.SubName   = _selfName;
                    addedInheritanceItem.Rank      = new LogicalValue(1);

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

                    _inheritanceItemsDict[name] = addedInheritanceItem;

                    _publicInheritanceStorage.SetInheritance(addedInheritanceItem);
                }
            }

            var oldIdList = _foundInheritanceKeysList.Except(idsList);

#if DEBUG
            //Log($"oldIdList = {JsonConvert.SerializeObject(oldIdList)}");
#endif

            if (oldIdList.Any())
            {
                foreach (var id in oldIdList)
                {
                    var name = id.NameValue;

                    _publicFactsStorage.RemoveById(_factsIdDict[name]);
                    _factsIdDict.Remove(name);

                    _publicInheritanceStorage.RemoveInheritance(_inheritanceItemsDict[name]);
                    _inheritanceItemsDict.Remove(name);
                }
            }

            _foundInheritanceKeysList = idsList;
        }
Example #18
0
        /// <inheritdoc/>
        protected override void OnRun()
        {
#if DEBUG
            //Log($"_state = {_state}");
            //Log($"_currToken = {_currToken}");
            //Log($"Result = {Result}");
            //Log($"_currentItem = {_currentItem}");
#endif

            switch (_state)
            {
            case State.Init:
                switch (_currToken.TokenKind)
                {
                case TokenKind.Word:
                    switch (_currToken.KeyWordTokenKind)
                    {
                    case KeyWordTokenKind.Is:
                        _state = State.WaitForItem;
                        break;

                    default:
                        throw new UnexpectedTokenException(_currToken);
                    }
                    break;

                default:
                    throw new UnexpectedTokenException(_currToken);
                }
                break;

            case State.WaitForItem:
                switch (_currToken.TokenKind)
                {
                case TokenKind.Word:
                    TryCreateCurrentItem();

                    _currentItem.Rank = new LogicalValue(1.0F);

                    _currentItem.SuperName = ParseName(_currToken.Content);
                    _state = State.GotSuperName;
                    break;

                case TokenKind.OpenSquareBracket:
                    _state = State.WaitForRank;
                    break;

                default:
                    throw new UnexpectedTokenException(_currToken);
                }
                break;

            case State.GotSuperName:
                switch (_currToken.TokenKind)
                {
                case TokenKind.OpenFigureBracket:
                    _context.Recovery(_currToken);
                    Exit();
                    break;

                case TokenKind.Comma:
                    _currentItem = null;
                    _state       = State.WaitForItem;
                    break;

                default:
                    throw new UnexpectedTokenException(_currToken);
                }
                break;

            case State.WaitForRank:
                switch (_currToken.TokenKind)
                {
                case TokenKind.Number:
                {
                    TryCreateCurrentItem();

                    _context.Recovery(_currToken);
                    var parser = new NumberParser(_context, true);
                    parser.Run();
                    _currentItem.Rank = parser.Result;
                    _state            = State.GotRankValue;
                }
                break;

                case TokenKind.Identifier:
                case TokenKind.Word:
                {
                    TryCreateCurrentItem();

                    var nextToken = _context.GetToken();

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

                    switch (nextToken.TokenKind)
                    {
                    case TokenKind.Word:
                    case TokenKind.Identifier:
                        _context.Recovery(nextToken);

                        _fuzzyLogicNonNumericSequenceValue = new FuzzyLogicNonNumericSequenceValue();
                        _fuzzyLogicNonNumericSequenceValue.AddIdentifier(ParseName(_currToken.Content));

                        _state = State.GotFuzzyLogicNonNumericSequenceItem;
                        break;

                    default:
                        _context.Recovery(nextToken);

                        _currentItem.Rank = ParseName(_currToken.Content);

                        _state = State.GotRankValue;
                        break;
                    }
                }
                break;

                default:
                    throw new UnexpectedTokenException(_currToken);
                }
                break;

            case State.GotFuzzyLogicNonNumericSequenceItem:
                switch (_currToken.TokenKind)
                {
                case TokenKind.Word:
                case TokenKind.Identifier:
                    _fuzzyLogicNonNumericSequenceValue.AddIdentifier(ParseName(_currToken.Content));

                    _state = State.GotFuzzyLogicNonNumericSequenceItem;
                    break;

                case TokenKind.CloseSquareBracket:
                    _currentItem.Rank = _fuzzyLogicNonNumericSequenceValue;
                    _state            = State.GotRank;
                    break;

                default:
                    throw new UnexpectedTokenException(_currToken);
                }
                break;

            case State.GotRankValue:
                switch (_currToken.TokenKind)
                {
                case TokenKind.CloseSquareBracket:
                    _state = State.GotRank;
                    break;

                default:
                    throw new UnexpectedTokenException(_currToken);
                }
                break;

            case State.GotRank:
                switch (_currToken.TokenKind)
                {
                case TokenKind.Word:
                    TryCreateCurrentItem();

                    _currentItem.SuperName = ParseName(_currToken.Content);
                    _state = State.GotSuperName;
                    break;

                default:
                    throw new UnexpectedTokenException(_currToken);
                }
                break;

            default:
                throw new ArgumentOutOfRangeException(nameof(_state), _state, null);
            }
        }
        /// <inheritdoc/>
        public void SetInheritance(InheritanceItem inheritanceItem, bool isPrimary)
        {
            var subItem = inheritanceItem.SubName;

            lock (_lockObj)
            {
#if DEBUG
                //Log($"kind = {_kind}");
                //Log($"subItem = {subItem}; superName = {inheritanceItem.SuperName}");
                //Log($"inheritanceItem = {inheritanceItem}");
                //Log($"isPrimary = {isPrimary}");
#endif
                //var indexedInheritanceItem = inheritanceItem.GetIndexed(_realStorageContext.MainStorageContext);

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

                var subName   = inheritanceItem.SubName;
                var superName = inheritanceItem.SuperName;

                if (subName.IsEmpty || superName.IsEmpty)
                {
                    return;
                }

                //var subNameNormalizedNameValue = subName.NormalizedNameValue;
                //var superNameNormalizedNameValue = superName.NormalizedNameValue;

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

                if (_nonIndexedInfo.ContainsKey(subName))
                {
                    var dict = _nonIndexedInfo[subName];
                    //var indexedDict = _indexedInfo[subNameKey];

                    if (dict.ContainsKey(superName))
                    {
                        var targetList = dict[superName];

#if DEBUG
                        //Log($"dict[superName].Count = {dict[superName].Count}");
                        //Log($"targetList = {targetList.WriteListToString()}");
#endif
                        var targetLongConditionalHashCode = inheritanceItem.GetLongConditionalHashCode();

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

                        //var targetIndexedList = indexedDict[superNameKey];

                        var itemsWithTheSameLongConditionalHashCodeList = targetList.Where(p => p.GetLongConditionalHashCode() == targetLongConditionalHashCode).ToList();

                        foreach (var itemWithTheSameLongConditionalHashCode in itemsWithTheSameLongConditionalHashCodeList)
                        {
                            targetList.Remove(itemWithTheSameLongConditionalHashCode);
                            NRemoveIngeritanceFact(itemWithTheSameLongConditionalHashCode);
                        }

                        //var itemsWithTheSameLongConditionalHashCodeList = indexedItemsWithTheSameLongConditionalHashCodeList.Select(p => p.OriginalInheritanceItem).ToList();

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

                        //foreach(var itemWithTheSameLongConditionalHashCode in itemsWithTheSameLongConditionalHashCodeList)
                        //{
                        //    targetList.Remove(itemWithTheSameLongConditionalHashCode);
                        //    NRemoveIngeritanceFact(itemWithTheSameLongConditionalHashCode);
                        //}

                        targetList.Add(inheritanceItem);

                        //targetIndexedList.Add(indexedInheritanceItem);
                    }
                    else
                    {
                        dict[superName] = new List <InheritanceItem>()
                        {
                            inheritanceItem
                        };
                        //indexedDict[superNameKey] = new List<IndexedInheritanceItem>() { indexedInheritanceItem };
                    }
                }
                else
                {
                    var dict = new Dictionary <StrongIdentifierValue, List <InheritanceItem> >();
                    _nonIndexedInfo[subName] = dict;
                    dict[superName]          = new List <InheritanceItem>()
                    {
                        inheritanceItem
                    };

                    //var indexedDict = new Dictionary<ulong, List<IndexedInheritanceItem>>();
                    //_indexedInfo[subNameKey] = indexedDict;
                    //indexedDict[superNameKey] = new List<IndexedInheritanceItem>() { indexedInheritanceItem };
                }
            }

            if (isPrimary && _kind != KindOfStorage.PublicFacts && _kind != KindOfStorage.PerceptedFacts)
            {
                var inheritanceFact = CreateInheritanceFact(inheritanceItem);

#if DEBUG
                //Log($"inheritanceFact = {inheritanceFact}");
                //inheritanceFact.CheckDirty();
                //Log($"inheritanceFact = {DebugHelperForRuleInstance.ToString(inheritanceFact)}");
#endif
                lock (_factsIdRegistryLockObj)
                {
                    _factsIdRegistry[inheritanceItem] = inheritanceFact.Name.NameValue;
                }

                _realStorageContext.LogicalStorage.Append(inheritanceFact, false);

                if (_kind == KindOfStorage.Global || _kind == KindOfStorage.Host)
                {
                    _inheritancePublicFactsReplicator.ProcessChangeInheritance(inheritanceItem.SubName, inheritanceItem.SuperName);
                }
            }

#if DEBUG
            //Log("End");
#endif
        }