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])); }
/// <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]);
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); }
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)); } }