コード例 #1
0
        public int[] SearchSimple
        (
            string key
        )
        {
            if (string.IsNullOrEmpty(key))
            {
                return(new int[0]);
            }

            TermLink[] result = new TermLink[0];

            if (key.EndsWith("$"))
            {
                key = key.Substring(0, key.Length - 1);
                if (!string.IsNullOrEmpty(key))
                {
                    result = SearchStart(key);
                }
            }
            else
            {
                result = SearchExact(key);
            }

            return(result
                   .Select(link => link.Mfn)
                   .Distinct()
                   .ToArray());
        }
コード例 #2
0
        /// <summary>
        /// Read the record.
        /// </summary>
        public static IfpRecord Read
        (
            [NotNull] Stream stream,
            long offset
        )
        {
            stream.Position = offset;

            IfpRecord result = new IfpRecord
            {
                LowOffset      = stream.ReadInt32Network(),
                HighOffset     = stream.ReadInt32Network(),
                TotalLinkCount = stream.ReadInt32Network(),
                BlockLinkCount = stream.ReadInt32Network(),
                Capacity       = stream.ReadInt32Network()
            };

            // ibatrak чтение вложенных записей в спец блоке
            // Специальный формат записи .ifp
            // В этом случае первой записью является специальный блок,
            // который представляет собой заголовок (обыкновенного формата),
            // в котором смещения имеют специальные значения = -1001
            if (result.LowOffset == -1001 && result.HighOffset == -1001)
            {
                // irbis64.dll делает так

                // читает первые 24 байта блока спец ссылок
                // (это 2 записи)
                // записи с реальными адресами идут через одну
                // берет вторую запись, адрес из нее в файле
                // и читает записеи IFP
                // по количеству result.BlockLinkCount

                // первую запись спец блока просто пропускаем,
                // читаем сразу вторую
                stream.Position += 12;

                SpecialPostingBlockEntry entry = new SpecialPostingBlockEntry
                {
                    Posting = stream.ReadInt32Network(),
                    Low     = stream.ReadInt32Network(),
                    High    = stream.ReadInt32Network()
                };

                stream.Position = entry.Offset;

                IfpRecord[] nestedRecords
                    = new IfpRecord[result.BlockLinkCount];
                for (int i = 0; i < result.BlockLinkCount; i++)
                {
                    var nestedRecord = Read(stream, stream.Position);
                    nestedRecords[i] = nestedRecord;

                    // Last record in the list must have
                    // negative offset values
                    if (nestedRecord.LowOffset == -1 &&
                        nestedRecord.HighOffset == -1)
                    {
                        if (i != result.BlockLinkCount - 1)
                        {
                            throw new InvalidOperationException
                                  (
                                      "IFP reading error"
                                  );
                        }
                        break;
                    }
                    if (nestedRecord.FullOffset < 0)
                    {
                        throw new InvalidOperationException
                              (
                                  "IFP reading error"
                              );
                    }

                    stream.Position = nestedRecord.FullOffset;
                }

                TermLink[] links = nestedRecords
                                   .SelectMany(r => r.Links)
                                   .ToArray();
                if (links.Length != result.TotalLinkCount)
                {
                    throw new InvalidOperationException
                          (
                              "IFP reading error"
                          );
                }
                result.Links.AddRange(links);

                return(result);
            }
            //ibatrak до сюда

            for (int i = 0; i < result.BlockLinkCount; i++)
            {
                TermLink link = TermLink.Read(stream);
                result.Links.Add(link);
            }

            return(result);
        }
コード例 #3
0
    //queue the new visualization (since creating a new visualization directly from output is broken)
    //returns success
    public bool VisualizeNewTermLink(Statement statement)
    {
        string statementKey = GetInheritanceString(statement.subjectPredicate);

        if (!conceptTable.ContainsKey(statementKey))
        {
            return(false);
        }
        Concept statementConcept = conceptTable[statementKey];

        if (conceptTable.ContainsKey(statement.subjectPredicate._subject) && conceptTable.ContainsKey(statement.subjectPredicate._predicate))
        {
            Concept subjectConcept   = conceptTable[statement.subjectPredicate._subject];
            Concept predicateConcept = conceptTable[statement.subjectPredicate._predicate];

            if (!termLinkTable.ContainsKey(statementConcept))
            {
                Queue <Concept> links = new Queue <Concept>();
                termLinkTable.Add(statementConcept, links);
            }

            if (!termLinkTable.ContainsKey(subjectConcept))
            {
                Queue <Concept> links = new Queue <Concept>();
                termLinkTable.Add(subjectConcept, links);
            }

            if (!termLinkTable.ContainsKey(predicateConcept))
            {
                Queue <Concept> links = new Queue <Concept>();
                termLinkTable.Add(predicateConcept, links);
            }

            if (!termLinkTable[statementConcept].Contains(subjectConcept))
            {
                termLinkTable[statementConcept].Enqueue(subjectConcept);
            }

            if (!termLinkTable[subjectConcept].Contains(statementConcept))
            {
                termLinkTable[subjectConcept].Enqueue(statementConcept);
            }

            if (!termLinkTable[statementConcept].Contains(predicateConcept))
            {
                termLinkTable[statementConcept].Enqueue(predicateConcept);
            }

            if (!termLinkTable[predicateConcept].Contains(statementConcept))
            {
                termLinkTable[predicateConcept].Enqueue(statementConcept);
            }

            GameObject newTermLinkGO = Instantiate(termLinkPrefab);
            TermLink   termLink      = newTermLinkGO.GetComponent <TermLink>();
            termLink.Init(statementConcept, subjectConcept);

            GameObject newTermLinkGO2 = Instantiate(termLinkPrefab);
            TermLink   termLink2      = newTermLinkGO2.GetComponent <TermLink>();
            termLink2.Init(statementConcept, predicateConcept);

            return(true);
        }

        return(false);
    }