예제 #1
0
        public TripleStoreInt32(Func <Stream> stream_gen, string tmp_dir_path)
        {
            // сначала таблица имен
            nt = new Nametable32(stream_gen);
            // Предзагрузка должна быть обеспечена даже для пустой таблицы имен
            PreloadFognames();
            // Тип Object Variants
            PType tp_ov = new PTypeUnion(
                new NamedType("dummy", new PType(PTypeEnumeration.none)),
                new NamedType("iri", new PType(PTypeEnumeration.integer)),
                new NamedType("str", new PType(PTypeEnumeration.sstring))
                //new NamedType("int", new PType(PTypeEnumeration.sstring)),
                //new NamedType("date", new PType(PTypeEnumeration.sstring)),
                //new NamedType("langstr", new PTypeRecord(
                //    new NamedType("lang", new PType(PTypeEnumeration.sstring)),
                //    new NamedType("str", new PType(PTypeEnumeration.sstring))))
                );
            PType tp_triple = new PTypeRecord(
                new NamedType("subj", new PType(PTypeEnumeration.integer)),
                new NamedType("pred", new PType(PTypeEnumeration.integer)),
                new NamedType("obj", tp_ov));

            // Главная последовательность кодированных триплетов
            //table = new UniversalSequenceBase(tp_triple, stream_gen());
            table = new BearingDeletable(tp_triple, stream_gen);

            // прямой ссылочный индекс
            s_index = new IndexKey32Comp(stream_gen, table, ob => true,
                                         ob => (int)((object[])ob)[0], null);

            // Обратный ссылочный индекс
            inv_index = new IndexKey32Comp(stream_gen, table,
                                           ob => (int)((object[])((object[])ob)[2])[0] == 1,
                                           obj =>
            {
                object[] pair = (object[])((object[])obj)[2];
                return((int)pair[1]);
            }, null);

            // Индекс по тексту объектов триплетов с предикатом http://fogid.net/o/name
            //int p_name = Int32.MinValue;
            Comparer <object> comp = Comparer <object> .Create(new Comparison <object>((object a, object b) =>
            {
                return(string.Compare(
                           (string)((object[])((object[])a)[2])[1],
                           (string)((object[])((object[])b)[2])[1], StringComparison.OrdinalIgnoreCase));
            }));

            int cod_name = nt.GetSetStr("http://fogid.net/o/name");

            name_index = new IndexView(stream_gen, table, ob => (int)((object[])ob)[1] == cod_name, comp);

            comp_like = Comparer <object> .Create(new Comparison <object>((object a, object b) =>
            {
                int len = ((string)((object[])((object[])b)[2])[1]).Length;
                return(string.Compare(
                           (string)((object[])((object[])a)[2])[1], 0,
                           (string)((object[])((object[])b)[2])[1], 0, len, StringComparison.OrdinalIgnoreCase));
            }));

            table.Indexes = new IIndex[] { s_index, inv_index, name_index };
        }
예제 #2
0
        public TripleRecordStore(Func <Stream> stream_gen, string tmp_dir_path, string[] preload_names)
        {
            // сначала таблица имен
            nt = new Nametable32(stream_gen);
            // Предзагрузка откладывается
            this.preload_names = preload_names;
            //LoadPreloadnames(); // Это потом

            // Тип записи
            PType tp_record = new PTypeRecord(
                new NamedType("id", new PType(PTypeEnumeration.integer)),
                new NamedType("directs",
                              new PTypeSequence(new PTypeRecord(
                                                    new NamedType("prop", new PType(PTypeEnumeration.integer)),
                                                    new NamedType("entity", new PType(PTypeEnumeration.integer))))),
                new NamedType("fields",
                              new PTypeSequence(new PTypeRecord(
                                                    new NamedType("prop", new PType(PTypeEnumeration.integer)),
                                                    new NamedType("value", new PType(PTypeEnumeration.sstring)),
                                                    new NamedType("lang", new PType(PTypeEnumeration.sstring)))))
                );

            // Главная последовательность: множестов кодированных записей
            table = new BearingDeletable(tp_record, stream_gen);
            // прямой ключевой индекс: по задаваемому ключу получаем запись
            s_index = new IndexKey32Comp(stream_gen, table, ob => true,
                                         ob => (int)((object[])ob)[0], null);
            // Обратный ссылочный индекс
            inv_index = new IndexKey32CompVector(stream_gen, table,
                                                 obj =>
            {
                object[] directs = (object[])((object[])obj)[1];
                return(directs.Cast <object[]>()
                       .Select(pair => (int)pair[1]));
            }, null);


            // Это компаратор сортировки. (более ранний комментарий: компаратор надо поменять!!!!!!)
            Comparer <object> comp = Comparer <object> .Create(new Comparison <object>((object a, object b) =>
            {
                object predval1 = ((object[])((object[])a)[2]).FirstOrDefault(pair => (int)((object[])pair)[0] == cod_name);
                object predval2 = ((object[])((object[])b)[2]).FirstOrDefault(pair => (int)((object[])pair)[0] == cod_name);

                return(string.Compare(
                           (string)((object[])predval1)[1],
                           (string)((object[])predval2)[1],
                           StringComparison.OrdinalIgnoreCase));
            }));

            comp_like = Comparer <object> .Create(new Comparison <object>((object a, object b) =>
            {
                string val1 = (string)((object[])((object[])((object[])a)[2]).FirstOrDefault(pair => (int)((object[])pair)[0] == cod_name))[1];
                string val2 = (string)((object[])((object[])((object[])b)[2]).FirstOrDefault(pair => (int)((object[])pair)[0] == cod_name))[1];
                if (string.IsNullOrEmpty(val2))
                {
                    return(0);
                }
                int len = val2.Length;
                return(string.Compare(
                           val1, 0,
                           val2, 0, len, StringComparison.OrdinalIgnoreCase));
            }));

            // name-индекс пока будет скалярным и будет индексировать первое (!) name-поле в записи
            name_index = new IndexView(stream_gen, table,
                                       ob => ((object[])((object[])ob)[2]).FirstOrDefault(pair => (int)((object[])pair)[0] == cod_name) != null, comp)
            {
                tmpdir = tmp_dir_path, volume_of_offset_array = 20_000_000
            };

            table.Indexes = new IIndex[] { s_index, inv_index, name_index };
        }