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(); }