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)); }
/// <summary> /// SQL文の抽出条件からロックを作成する /// </summary> /// <typeparam name="TRecord"></typeparam> /// <param name="apTranId">APトランザクションID</param> /// <param name="sql">SQL文</param> /// <returns>作成したロックデータ</returns> /// <remarks></remarks> private List <LockData> CreateLockData <TRecord>(long apTranId , SqlBuilder sql) where TRecord : class, IRecord, new() { List <LockData> ret = new List <LockData>(); //TRecord型レコードとテーブルのマッピング情報を取得する RecordViewTableMap <TRecord> aRecordViewTableMap = _aRecordViewTableMapFactory.CreateRecordViewTableMap <TRecord>(); //TRecord型レコードのメタ情報を取得する RecordInfo <TRecord> aRecordInfo = aRecordViewTableMap.GetRecordInfo(); //テーブル列リストを作成する Dictionary <string, IEnumerable <string> > tableColumns = new Dictionary <string, IEnumerable <string> >(); foreach (string srcTableName in sql.GetSrcTableNames()) { //相関テーブルの主キーリストを作成する List <string> allColumnNames = new List <string>(); foreach (ColumnInfo column in aRecordViewTableMap.GetTableInfo(srcTableName).GetAllColumns()) { allColumnNames.Add(column.ColumnName); } tableColumns.Add(srcTableName, allColumnNames); } //SQL文の抽出条件からロック情報を作成する foreach (KeyValuePair <SqlTable, Dictionary <string, string> > tableNameCnfPair in sql.GetCNF(tableColumns)) { string srcTableName = tableNameCnfPair.Key.Name; Dictionary <string, string> cnf = tableNameCnfPair.Value; LockData aLockData = this.CreateLockDataSub(aRecordViewTableMap , apTranId , aRecordInfo.Name , srcTableName , cnf); ret.Add(aLockData); } return(ret); }