/// <summary> /// 2つの乗法標準形の論理式が包摂しているか判定する /// </summary> /// <param name="lCnf">論理式1</param> /// <param name="rCnf">論理式2</param> /// <returns>包摂している:True、していない:False</returns> /// <remarks></remarks> private bool IsSubsumption(CNFofEquation lCnf, CNFofEquation rCnf) { //一致条件の左辺の文字コード順で並べ替える lCnf.Sort(); rCnf.Sort(); //最初にeq2とeq1の変数名を比較するため、Forループ前にMoveNext()する if (!rCnf.MoveNext()) { //cnfに素論理式がなければ、包摂している lCnf.Reset(); rCnf.Reset(); return(true); } Equation eq2 = rCnf.Current; foreach (Equation eq1 in lCnf) { //eq1と同じ素論理式までrCnfをイテレートする //Equation eq2 = null; //while(rCnf.MoveNext()) { // eq2 = rCnf.Current; // if(eq2.Variable >= eq1.Variable) { // break; // } //} //eq1と同じ素論理式までrCnfをイテレートする while (eq2.Variable.CompareTo(eq1.Variable) < 0 && rCnf.MoveNext()) { eq2 = rCnf.Current; } //cnfが最後までイテレートされていれば、包摂している if (eq2 == null) { //読込位置をリセットする lCnf.Reset(); rCnf.Reset(); return(true); } //素論理式の包摂判定 if (eq2.Variable == eq1.Variable && eq2.Value != eq1.Value) { //読込位置をリセットする lCnf.Reset(); rCnf.Reset(); //包摂していない return(false); } } //読込位置をリセットする lCnf.Reset(); rCnf.Reset(); return(true); }
public LockData(long apTranId , string recordName , string tableOwner , string tableName , CNFofEquation predicate = null) { //LockIDは乱数で決定する _lockId = _random.Next(); _apTranId = apTranId; _recordName = recordName; _tableOwner = tableOwner; _tableName = tableName; _predicate = predicate; }
/// <summary> /// 論理式同士の包摂判定を行う /// </summary> /// <param name="cnf">論理式1</param> /// <param name="cnfs">論理式2-N</param> /// <returns>包摂している:True、していない:False</returns> /// <remarks>論理式2-N同士の包摂判定は行わない</remarks> private bool IsSubsumption(CNFofEquation cnf, params CNFofEquation[] cnfs) { //判定対象の論理式が無ければ包摂していないとする if (cnfs.Length == 0) { return(false); } foreach (CNFofEquation cnf1 in cnfs) { if (this.IsSubsumption(cnf, cnf1)) { return(true); } } //全てのcnfsと包摂していなければ包摂していないと判定する return(false); }
private LockData CreateLockDataSub <TRecord>(RecordViewTableMap <TRecord> aRecordViewTableMap , long apTranId , string recordName , string tableName , Dictionary <string, string> cnf) where TRecord : class, IRecord, new() { //主キーを含む全ての一致条件を格納するオブジェクト CNFofEquation cnfOfEquation = new CNFofEquation(); //主キーに対する一致条件のみを格納するオブジェクト CNFofEquation cnfOfPKey = new CNFofEquation(); //乗法標準形を用意する foreach (KeyValuePair <string, string> eqPredicate in cnf) { string varName = eqPredicate.Key; //SQLリテラル表記で値を取得する string value = eqPredicate.Value; //valueがIsNullPropertyValue()でNULL値と判定された場合、Predicateに含まれない(暫定実装) TableInfo aTableInfo = aRecordViewTableMap.GetTableInfo(tableName); ColumnInfo aColumnInfo = aTableInfo[varName]; //一致条件を述語に追加する cnfOfEquation.Add(new Equation(varName, value)); //主キーに対する一致条件であればcnfOfPKeyにも格納する if (aColumnInfo.PrimaryKey.HasValue && aColumnInfo.PrimaryKey.Value) { cnfOfPKey.Add(new Equation(varName, value)); //テーブルの全ての主キーに対する一致条件が取得できれば、 //主キーに対する一致条件のみの述語だけで必要十分である if (cnfOfPKey.Count == aTableInfo.GetPrimaryKeys().Count) { return(new LockData(apTranId, recordName, "", tableName, cnfOfPKey)); } } } return(new LockData(apTranId, recordName, "", tableName, cnfOfEquation)); }