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); }
// Определение всех данных по заданным 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); }
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); }