Esempio n. 1
0
        /// <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);
        }
Esempio n. 2
0
 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;
 }
Esempio n. 3
0
        /// <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);
        }
Esempio n. 4
0
        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));
        }