Exemplo n.º 1
0
        public void Load() // В стандартном случае, задается null
        {
            offsetsCell.Clear();
            if (!offsetsOnOffsetsCell.IsEmpty && offsetsOnOffsetsCell.Root.Count() != (long)Int32.MaxValue + Int32.MaxValue)
            {
                offsetsOnOffsetsCell.Clear();
            }
            if (offsetsOnOffsetsCell.IsEmpty)
            {
                offsetsOnOffsetsCell.Fill(new object[0]);
                for (int i = Int32.MinValue; i < Int32.MaxValue; i++)
                {
                    offsetsOnOffsetsCell.Root.AppendElement(long.MinValue);
                }
                offsetsOnOffsetsCell.Flush();
            }
            else
            {
                for (long i = 0; i < (long)Int32.MaxValue + Int32.MaxValue; i++)
                {
                    offsetsOnOffsetsCell.Root.Element(i).Set(long.MinValue);
                }
            }
            offsetsCell.Fill(new object[0]);
            ArrayIntMax <bool> hashExists = new ArrayIntMax <bool>();

            foreach (var rec in table.Root.Elements()) //.Where(ent => (bool)ent.Field(0).Get() == false) загрузка всех элементов за исключением уничтоженных
            {
                Tkey  key  = keyProducer(rec);
                Int32 hash = hashProducer(key);
                var   offsetOnOffsetEntry = offsetsOnOffsetsCell.Root.Element((long)hash + (long)Int32.MaxValue);
                if (hashExists[hash])
                {
                    entryOffsetCell.offset = (long)offsetOnOffsetEntry.Get() + 8; //пропускаем первый.
                    int i = 1;
                    while ((long)entryOffsetCell.Get() != long.MinValue)
                    {
                        if (++i == CollisionMax)
                        {
                            throw new Exception(
                                      "Достигнуо максимально допустимое количество ключей с одинаковым хэш-значением");
                        }
                        entryOffsetCell.offset += 8;
                    }
                    entryOffsetCell.Set(rec.offset);
                }
                else
                {
                    hashExists[hash] = true;
                    offsetOnOffsetEntry.Set(offsetsCell.Root.AppendElement(rec.offset));
                    for (int i = 1; i < CollisionMax; i++)
                    {
                        offsetsCell.Root.AppendElement(long.MinValue);
                    }
                }
            }
            offsetsCell.Flush();
        }
        public void Compress(PaCell dtriplets, PredicatesCoding predicatesCoding)
        {
            stringsArhive.WriteCell();
            PaEntry paEntry = stringsCell.Root.Element(0);

            foreach (var dtripletElement in dtriplets.Root.Elements())
            {
                int predicateCode = (int)dtripletElement.Field(1).Get();
                if (predicatesCoding.LiteralVid[predicateCode] == LiteralVidEnumeration.text)
                {
                    PaEntry offsetElement = dtripletElement.Field(2);
                    long    offset        = (long)offsetElement.Get();
                    paEntry.offset = offset;
                    object[] stri_lang = (object[])paEntry.Get();

                    offsetElement.Set(
                        StringsArchedCell.Root.AppendElement(new object[] {
                        Enumerable.Cast <object>(stringsArhive.Compress((string)stri_lang[0])).ToArray(),
                        Enumerable.Cast <object>(stringsArhive.Compress((string)stri_lang[01])).ToArray()
                    }));
                }
            }
            StringsArchedCell.Flush();
        }