Example #1
0
        public static IEnumerable <OValRowInt> _spo(this IEnumerable <OValRowInt> rows, short subj, short pred, short obj)
        {
            var query = rows.Where(ovr =>
            {
                OVal[] row = ovr.row;
                // будем "плясать" от субъекта. TODO: наверное можно как-то задействовать и объектную цепочку
                OVal subj_oval = row[subj];
                OVal pred_oval = row[pred];
                OVal obj_oval  = row[obj];
                // Проверим через шкалу
                if (!ovr.Store.ChkInScale(subj_oval.entity, pred_oval.entity, obj_oval.entity))
                {
                    return(false);
                }
                Diapason diap = new Diapason();
                if (subj_oval.spo_number >= 0)
                { // Диапазон определен
                    diap.start = subj_oval.spo_start;
                    diap.numb  = subj_oval.spo_number;
                }
                else
                {
                    Diapason di = ovr.Store.GetDiap_spo(subj_oval.entity);
                    diap.start  = subj_oval.spo_start = di.start;
                    diap.numb   = subj_oval.spo_number = di.numb;
                }

                return(ovr.Store.CheckPredObjInDiapason(diap, ovr.row[pred].entity, ovr.row[obj].entity));
            });

            return(query);
        }
Example #2
0
        // Определение всех данных по заданным s-p
        public static IEnumerable <OValRowInt> _spD(this IEnumerable <OValRowInt> rows, short subj, short pred, short dat)
        {
            var query = rows.SelectMany(ovr =>
            {
                OVal[] row     = ovr.row;
                OVal subj_oval = row[subj];
                OVal pred_oval = row[pred];
                OVal dat_oval  = row[dat];
                Diapason diap  = new Diapason();
                if (subj_oval.spd_number >= 0)
                { // Диапазон определен
                    diap.start = subj_oval.spd_start;
                    diap.numb  = subj_oval.spd_number;
                }
                else
                {
                    Diapason di = ovr.Store.GetDiapason_spd(subj_oval.entity);
                    diap.start  = subj_oval.spd_start = di.start;
                    diap.numb   = subj_oval.spd_number = di.numb;
                }
                return(ovr.Store.GetDatInDiapason(diap, row[pred].entity)
                       .Select(lit =>
                {
                    row[dat].lit = lit;
                    return new OValRowInt(ovr.Store, row);
                }));
            });

            return(query);
        }
Example #3
0
        public static IEnumerable <OValRowInt> _Spo(this IEnumerable <OValRowInt> rows, short subj, short pred, short obj)
        {
            // Определены объект и предикат, нужно найти множество субъектов, побочным эффектом будет определение
            // и фиксация диапазона. Если диапазон уже есть, то диапазон не вычисляется, а используется
            var query = rows.SelectMany(rw =>
            {
                var row       = rw.row;
                OVal obj_oval = row[obj];
                Diapason diap = new Diapason();
                if (obj_oval.spo_number >= 0)
                { // Диапазон определен
                    diap.start = obj_oval.spo_start;
                    diap.numb  = obj_oval.spo_number;
                }
                else
                {
                    Diapason di = rw.Store.GetDiap_op(obj_oval.entity);
                    diap.start  = obj_oval.spo_start = di.start;
                    diap.numb   = obj_oval.spo_number = di.numb;
                }
                return(rw.Store.GetSubjInDiapason(diap, row[pred].entity)
                       .Select(su =>
                {
                    row[subj].entity = su; row[subj].op_number = -1; row[subj].spd_number = -1; row[subj].spo_number = -1;
                    return new OValRowInt(rw.Store, row);
                }));
            });

            return(query);
        }