예제 #1
0
        public IEnumerable <object> GetPersonsByName(string firstpartofname)
        {
            firstpartofname = firstpartofname.ToLower();
            PaEntry entry = tab_person.Element(0);
            var     query = index_person_name.GetAllByLevel(s =>
            {
                string ss = s.ToLower();
                if (ss.StartsWith(firstpartofname))
                {
                    return(0);
                }
                return(ss.CompareTo(firstpartofname));
            });

            return(query
                   .Select(ent =>
            {
                //long off = (long)ent.Get();
                //entry.offset = off;
                return entry.Get();
            })
                   .Cast <object[]>()
                   .Where(pair => !((bool)pair[0]))
                   .Select(pair => pair[1]));
        }
예제 #2
0
 /// <summary>
 /// Вызывает GetAllByLevel, отсеивает удалённые строки где row[0] = false и возвращает содержимое row[1].
 /// </summary>
 /// <typeparam name="Tkey"></typeparam>
 /// <typeparam name="IndexImmut"></typeparam>
 /// <param name="index"></param>
 /// <param name="levelFunc">Функция применяется к содержимому таблицы row[1] </param>
 /// <returns></returns>
 public static IEnumerable <object[]> GetAllUndeletedByLevel <Tkey, IndexImmut>(
     this IndexDynamic <Tkey, IndexImmut> index,
     Func <object[], int> levelFunc)
     where IndexImmut : IIndexImmutable <Tkey> =>
 index.GetAllByLevel(ent => levelFunc(ent.Get().CastRow <object, object[]>().Item2))
 .Select(ent => (object[])ent.Get())
 .Where(row => !(bool)row[0])
 .Select(row => (object[])row[1]);
예제 #3
0
        public IEnumerable <object> GetTriplesBySubject(int subj)
        {
            var q = index_spo.GetAllByLevel((PaEntry ent) =>
            {
                object[] rec = (object[])((object[])((object[])ent.Get()))[1];
                return(((int)rec[0]).CompareTo(subj));
            }).Select(ent => ((object[])ent.Get())[1])
                    .ToArray();

            return(q);
        }
예제 #4
0
        public static void Main4(string[] args)
        {
            Random rnd = new Random();

            Console.WriteLine("Start Task04_Sequenses_Main3");
            System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
            PType tp_person = new PTypeRecord(
                new NamedType("id", new PType(PTypeEnumeration.integer)),
                new NamedType("name", new PType(PTypeEnumeration.sstring)),
                new NamedType("age", new PType(PTypeEnumeration.real)));

            TableView tab_person = new TableView(path + "tab_person.pac", tp_person);
            IndexViewImmutable <string> name_index = new IndexViewImmutable <string>(path + "name_index.pac")
            {
                Table       = tab_person,
                KeyProducer = v => (string)((object[])((object[])v)[1])[1]
            };
            IndexDynamic <string, IndexViewImmutable <string> > index_person_name = new IndexDynamic <string, IndexViewImmutable <string> >(false, name_index);

            tab_person.RegisterIndex(index_person_name);

            int  nelements = 1_000_000;
            bool toload    = true; // Загружать или нет новую базу данных

            if (toload)
            {
                sw.Restart();
                // Очистим ячейки последовательности и индекса
                tab_person.Clear();

                IEnumerable <object> flow = Enumerable.Range(0, nelements)
                                            .Select(i =>
                {
                    int id      = nelements - i;
                    string name = "=" + id.ToString() + "=";
                    double age  = rnd.NextDouble() * 100.0;
                    return(new object[] { id, name, age });
                });
                tab_person.Fill(flow);

                // Теперь надо отсортировать индексный массив по ключу
                tab_person.BuildIndexes();
                sw.Stop();
                Console.WriteLine("Load ok. duration for {0} elements: {1} ms", nelements, sw.ElapsedMilliseconds);
            }
            else
            {
                tab_person.Warmup();
            }

            // Проверим работу
            int search_key = nelements * 2 / 3;
            var ob         = index_person_name.GetAllByKey("=" + search_key + "=")
                             .Select(ent => ((object[])ent.Get())[1])
                             .FirstOrDefault();

            if (ob == null)
            {
                throw new Exception("Didn't find person " + search_key);
            }
            Console.WriteLine("Person {0} has name {1}", search_key, ((object[])ob)[1]);

            // Засечем скорость выборок
            int nprobe = 1000;

            sw.Restart();
            for (int i = 0; i < nprobe; i++)
            {
                search_key = rnd.Next(nelements) + 1;
                ob         = index_person_name.GetAllByKey("=" + search_key + "=")
                             .Select(ent => ((object[])ent.Get())[1])
                             .FirstOrDefault();
                if (ob == null)
                {
                    throw new Exception("Didn't find person " + search_key);
                }
                string nam = (string)((object[])ob)[1];
            }
            sw.Stop();
            Console.WriteLine($"Duration for {nprobe} search in {nelements} elements: {sw.ElapsedMilliseconds} ms");

            string search_string = "=66666";
            var    query         = index_person_name.GetAllByLevel((PaEntry entry) =>
            {
                var name = (string)((object[])((object[])entry.Get())[1])[1];
                if (name.StartsWith(search_string))
                {
                    return(0);
                }
                return(name.CompareTo(search_string));
            });

            foreach (object v in query.Select(entry => ((object[])entry.Get())[1]))
            {
                Console.WriteLine(tp_person.Interpret(v));
            }
        }