示例#1
0
        /// <summary>
        /// Generate the query SQL. Do not actually run it.
        /// </summary>
        /// <param name="query">The structured query object to convert.</param>
        /// <param name="settings">Build-time settings for the conversion.</param>
        /// <returns>An object structure containing SQL, and other discovered information.</returns>
        public QueryBuild BuildSql(StructuredQuery query, QuerySqlBuilderSettings settings)
        {
            if (query == null)
            {
                throw new ArgumentNullException("query");
            }

            // Initialise settings
            if (settings == null)
            {
                settings = new QuerySqlBuilderSettings( );
            }

            // Optimise tree
            StructuredQuery optimisedQuery = StructuredQueryHelper.PruneQueryTree(query);

            // Generate SQL
            QueryBuilder queryBuilder = new QueryBuilder(optimisedQuery, settings);
            QueryBuild   result       = queryBuilder.GetSqlInternal( );

            // Logging
            using (MessageContext msg = new MessageContext("Reports"))
            {
                msg.Append(() => new string( '-', 50 ));
                msg.Append(() => "Final structured query:\n" + StructuredQueryHelper.ToXml(optimisedQuery));
                msg.Append(() => new string( '-', 50 ));
                msg.Append(() => "SQL:\n" + result.Sql);
                msg.Append(() => new string( '-', 50 ));
            }

            // Note: identify cache dependencies after getting SQL, so that any calculations are resolved into the structured query.
            IdentifyCacheDependencies(optimisedQuery, settings);

            return(result);
        }
        public void Test_SqlIsUncacheable( )
        {
            CachingQuerySqlBuilder  cachingQuerySqlBuilder;
            Mock <IQuerySqlBuilder> mockQuerySqlBuilder;
            IQuerySqlBuilder        querySqlBuilder;
            StructuredQuery         structuredQuery;
            QuerySqlBuilderSettings settings;
            QueryBuild           queryBuild;
            IUserRuleSetProvider userRuleSetProvider = MockUserRuleSetProvider( );

            structuredQuery             = new StructuredQuery( );
            settings                    = new QuerySqlBuilderSettings( );
            queryBuild                  = new QueryBuild( );
            queryBuild.SqlIsUncacheable = true;

            mockQuerySqlBuilder = new Mock <IQuerySqlBuilder>(MockBehavior.Strict);
            mockQuerySqlBuilder.Setup(x => x.BuildSql(structuredQuery, settings))
            .Returns(() => queryBuild)
            .Verifiable( );
            querySqlBuilder        = mockQuerySqlBuilder.Object;
            cachingQuerySqlBuilder = new CachingQuerySqlBuilder(querySqlBuilder, userRuleSetProvider);

            cachingQuerySqlBuilder.BuildSql(structuredQuery, settings);
            cachingQuerySqlBuilder.BuildSql(structuredQuery, settings);

            mockQuerySqlBuilder.Verify(x => x.BuildSql(structuredQuery, settings), Times.Exactly(2));
            mockQuerySqlBuilder.VerifyAll( );
        }
示例#3
0
        /// <summary>
        /// ログイン情報取得
        /// </summary>
        /// <remarks>
        /// 作成者    :  sesaki
        /// 作成日    :  2019/10/30
        /// </remarks>
        public DataRow GetLoginUser(Condition condition)
        {
            DataTable dtTable;
            DataRow   dtRow = null;

            List <object> paraList = new List <object>();
            string        queryStr = QueryBuild.SystemLogin(condition, ref paraList);

            DataBase dataBase = new DataBase();

            dataBase.ConnectDB();

            DataSet dtSet = dataBase.GetDataSet(queryStr, paraList.ToArray());

            dtTable = dtSet.Tables[0];

            if (dtTable.Rows.Count != 0)
            {
                dtRow = dtTable.Rows[0];
            }

            if (dataBase != null)
            {
                dataBase.DisconnectDB();
            }
            if (dtSet != null)
            {
                dtSet.Dispose();
            }

            return(dtRow);
        }
示例#4
0
        public void Test_Cached( )
        {
            CachingQueryRunner   cachingQueryRunner;
            Mock <IQueryRunner>  mockQueryRunner;
            IQueryRunner         queryRunner;
            StructuredQuery      structuredQuery;
            QuerySettings        settings;
            QueryBuild           queryBuild;
            QueryResult          result;
            IQuerySqlBuilder     queryBuilder        = MockQuerySqlBuilder( );
            IUserRuleSetProvider userRuleSetProvider = MockUserRuleSetProvider( );

            structuredQuery = new StructuredQuery( );
            settings        = new QuerySettings( );
            queryBuild      = new QueryBuild( );
            result          = new QueryResult(queryBuild);

            mockQueryRunner = new Mock <IQueryRunner>(MockBehavior.Strict);
            mockQueryRunner.Setup(x => x.ExecutePrebuiltQuery(structuredQuery, settings, It.IsNotNull <QueryBuild>()))
            .Returns(() =>
            {
                return(result);
            })
            .Verifiable( );
            queryRunner        = mockQueryRunner.Object;
            cachingQueryRunner = new CachingQueryRunner(queryRunner, userRuleSetProvider, queryBuilder);

            Assert.That(cachingQueryRunner.ExecuteQuery(structuredQuery, settings),
                        Is.SameAs(result));
            Assert.That(cachingQueryRunner.Cache,
                        Has.Count.EqualTo(1));

            mockQueryRunner.Verify(x => x.ExecutePrebuiltQuery(structuredQuery, settings, It.IsNotNull <QueryBuild>( )), Times.Exactly(1));
            mockQueryRunner.VerifyAll( );
        }
        public void Test_EnsureCached_TwoThreads( )
        {
            CachingQuerySqlBuilder  cachingQuerySqlBuilder;
            Mock <IQuerySqlBuilder> mockQuerySqlBuilder;
            IQuerySqlBuilder        querySqlBuilder;
            StructuredQuery         structuredQuery;
            QuerySqlBuilderSettings settings;
            QueryBuild           queryBuild;
            IUserRuleSetProvider userRuleSetProvider = MockUserRuleSetProvider( );

            structuredQuery = new StructuredQuery( );
            settings        = new QuerySqlBuilderSettings( );
            queryBuild      = new QueryBuild( );

            mockQuerySqlBuilder = new Mock <IQuerySqlBuilder>(MockBehavior.Strict);
            mockQuerySqlBuilder.Setup(x => x.BuildSql(structuredQuery, settings))
            .Returns(() => {
                Thread.Sleep(100);
                return(queryBuild);
            })
            .Verifiable( );
            querySqlBuilder        = mockQuerySqlBuilder.Object;
            cachingQuerySqlBuilder = new CachingQuerySqlBuilder(querySqlBuilder, userRuleSetProvider);

            Task task1 = Task.Factory.StartNew(() => cachingQuerySqlBuilder.BuildSql(structuredQuery, settings));

            Thread.Sleep(1);   // BlockIfPending can handle overlapping, but no coincident requests
            Task task2 = Task.Factory.StartNew(() => cachingQuerySqlBuilder.BuildSql(structuredQuery, settings));

            Task.WaitAll(task1, task2);

            mockQuerySqlBuilder.Verify(x => x.BuildSql(structuredQuery, settings), Times.Exactly(1));
            mockQuerySqlBuilder.VerifyAll( );
        }
        public void Test_Cached()
        {
            CachingQuerySqlBuilder  cachingQuerySqlBuilder;
            Mock <IQuerySqlBuilder> mockQuerySqlBuilder;
            IQuerySqlBuilder        querySqlBuilder;
            StructuredQuery         structuredQuery;
            QuerySqlBuilderSettings settings;
            QueryBuild           queryBuild;
            IUserRuleSetProvider userRuleSetProvider = MockUserRuleSetProvider( );

            structuredQuery = new StructuredQuery( );
            settings        = new QuerySqlBuilderSettings( );
            queryBuild      = new QueryBuild( );

            mockQuerySqlBuilder = new Mock <IQuerySqlBuilder>(MockBehavior.Strict);
            mockQuerySqlBuilder.Setup(x => x.BuildSql(structuredQuery, settings))
            .Returns(() => queryBuild)
            .Verifiable();
            querySqlBuilder        = mockQuerySqlBuilder.Object;
            cachingQuerySqlBuilder = new CachingQuerySqlBuilder(querySqlBuilder, userRuleSetProvider);

            Assert.That(cachingQuerySqlBuilder.BuildSql(structuredQuery, settings),
                        Is.SameAs(queryBuild), "Incorrect conversion");
            Assert.That(cachingQuerySqlBuilder.Cache,
                        Has.Count.EqualTo(1));

            mockQuerySqlBuilder.Verify(x => x.BuildSql(structuredQuery, settings), Times.Exactly(1));
            mockQuerySqlBuilder.VerifyAll();
        }
        internal static void Test_Scenario(StructuredQuery structuredQuery, Action invalidationCallback, bool expectInvalidation)
        {
            CachingQuerySqlBuilder  cachingQuerySqlBuilder;
            Mock <IQuerySqlBuilder> mockQuerySqlBuilder;
            IQuerySqlBuilder        querySqlBuilder;
            QuerySettings           settings;
            QueryBuild           queryBuild;
            IUserRuleSetProvider userRuleSetProvider = MockUserRuleSetProvider( );

            settings   = new QuerySettings( );
            queryBuild = new QueryBuild( );

            var cacheInvalidators = new CacheInvalidatorFactory( ).CacheInvalidatorsList_TestOnly;

            mockQuerySqlBuilder = new Mock <IQuerySqlBuilder>(MockBehavior.Strict);
            mockQuerySqlBuilder.Setup(x => x.BuildSql(It.IsAny <StructuredQuery>( ), settings))
            .Returns <StructuredQuery, QuerySettings>((sq, qs) =>
            {
                QuerySqlBuilder.IdentifyCacheDependencies(sq, settings);
                return(queryBuild);
            })
            .Verifiable( );
            querySqlBuilder        = mockQuerySqlBuilder.Object;
            cachingQuerySqlBuilder = new CachingQuerySqlBuilder(querySqlBuilder, userRuleSetProvider);

            try
            {
                // Add current cache invalidator to global factory
                cacheInvalidators.Add(cachingQuerySqlBuilder.CacheInvalidator);

                using (var scope = Factory.Current.BeginLifetimeScope(cb =>
                {
                    cb.Register(c => cachingQuerySqlBuilder).As <ICacheService>( );
                }))
                    using (Factory.SetCurrentScope(scope))
                    {
                        // Run first time
                        cachingQuerySqlBuilder.BuildSql(structuredQuery.DeepCopy( ), settings);

                        // Perform potential invalidation task
                        using (new SecurityBypassContext( ))
                        {
                            invalidationCallback( );
                        }

                        // Run second time
                        cachingQuerySqlBuilder.BuildSql(structuredQuery.DeepCopy( ), settings);
                    }

                int times = expectInvalidation ? 2 : 1;
                mockQuerySqlBuilder.Verify(x => x.BuildSql(It.IsAny <StructuredQuery>( ), settings), Times.Exactly(times));
                mockQuerySqlBuilder.VerifyAll( );
            }
            finally
            {
                // Restore cache invalidators
                cacheInvalidators.Remove(cachingQuerySqlBuilder.CacheInvalidator);
            }
        }
示例#8
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="queryResult">The container that describes what SQL needs to be run, and what parameters need to be bound.</param>
 /// <param name="fieldType">Type of field that this query resolves.</param>
 internal EntityResolver([NotNull] QueryBuild queryResult, DataType fieldType)
 {
     if (queryResult == null)
     {
         throw new ArgumentNullException("queryResult");
     }
     _queryResult = queryResult;
     _fieldType   = fieldType;
 }
示例#9
0
        public void Test_EnsureResultsFromDifferentInstancesReturnCorrectRequestColumnData( )
        {
            CachingQueryRunner   cachingQueryRunner;
            Mock <IQueryRunner>  mockQueryRunner;
            IQueryRunner         queryRunner;
            QuerySettings        settings;
            QueryBuild           queryBuild;
            QueryResult          result;
            IQuerySqlBuilder     queryBuilder        = MockQuerySqlBuilder( );
            IUserRuleSetProvider userRuleSetProvider = MockUserRuleSetProvider( );

            StructuredQuery sq1 = new StructuredQuery {
                RootEntity = new ResourceEntity("test:person")
            };

            sq1.SelectColumns.Add(new SelectColumn {
                Expression = new ResourceExpression(sq1.RootEntity, "core:name")
            });

            StructuredQuery sq2 = new StructuredQuery {
                RootEntity = new ResourceEntity("test:person")
            };

            sq2.SelectColumns.Add(new SelectColumn {
                Expression = new ResourceExpression(sq2.RootEntity, "core:name")
            });

            Assert.That(sq1.SelectColumns [0].ColumnId, Is.Not.EqualTo(sq2.SelectColumns [0].ColumnId));

            settings   = new QuerySettings( );
            queryBuild = new QueryBuild( );
            result     = new QueryResult(queryBuild);
            result.Columns.Add(new ResultColumn {
                RequestColumn = sq1.SelectColumns [0]
            });

            mockQueryRunner = new Mock <IQueryRunner>(MockBehavior.Strict);
            mockQueryRunner.Setup(x => x.ExecutePrebuiltQuery(sq1, settings, It.IsNotNull <QueryBuild>( )))
            .Returns(() => result)
            .Verifiable( );
            queryRunner        = mockQueryRunner.Object;
            cachingQueryRunner = new CachingQueryRunner(queryRunner, userRuleSetProvider, queryBuilder);

            QueryResult result1 = cachingQueryRunner.ExecuteQuery(sq1, settings);

            Assert.That(result1.Columns [0].RequestColumn, Is.EqualTo(sq1.SelectColumns [0]));

            QueryResult result2 = cachingQueryRunner.ExecuteQuery(sq2, settings);

            Assert.That(result2.Columns [0].RequestColumn, Is.EqualTo(sq2.SelectColumns [0]));

            mockQueryRunner.Verify(x => x.ExecutePrebuiltQuery(sq1, settings, It.IsNotNull <QueryBuild>( )), Times.Exactly(1));
            mockQueryRunner.VerifyAll( );
        }
示例#10
0
        /// <summary>
        /// 検索結果取得
        /// </summary>
        /// <remarks>
        /// 作成者    :  nakao
        /// 作成日    :  2019/11/08
        /// </remarks>
        public void GetSearchResults()
        {
            // 検索条件が正しければ検索実施
            if (Condition.ValidateSearch() == false)
            {
                return;
            }

            DataSet  dtSet    = null;
            DataBase dataBase = null;

            try
            {
                long unfinishedCount = 0;
                SearchResults = new List <SearchResult>();
                List <object> paraList = new List <object>();
                string        queryStr = QueryBuild.GetSeihanMgmtList(Condition, ref paraList);

                dataBase = new DataBase();
                dataBase.ConnectDB();

                dtSet = dataBase.GetDataSet(queryStr, paraList.ToArray());  // クエリ実行

                foreach (DataRow row in dtSet.Tables[0].Rows)
                {
                    SearchResult sr = new SearchResult(row);
                    SearchResults.Add(sr);

                    if (sr.IsUnfinished())
                    {
                        unfinishedCount++;                      // 未完了集計
                    }
                }

                ResultCount = unfinishedCount.ToString() + "/" + SearchResults.Count.ToString();

                dataBase.DisconnectDB();
            }
            catch (Exception ex)
            {
                SearchErrorMessage = Resources.TextResource.ErrorGetSearchResult;
            }
            finally
            {
                if (dataBase != null)
                {
                    dataBase.DisconnectDB();
                }
                if (dtSet != null)
                {
                    dtSet.Dispose();
                }
            }
        }
示例#11
0
        /// <summary>
        /// 検索結果取得
        /// </summary>
        /// <remarks>
        /// 作成者    :  sesaki
        /// 作成日    :  2019/09/19
        /// </remarks>
        public void GetSearchResults()
        {
            // 検索条件が正しければ検索実施
            if (Condition.ValidateSearch() == false)
            {
                return;
            }

            DataSet  dtSet    = null;
            DataBase dataBase = null;

            try
            {
                long totalCount = 0;
                SearchResults = new List <SearchResult>();
                List <object> paraList = new List <object>();
                string        queryStr = QueryBuild.GetSappanSearch(Condition, ref paraList);

                dataBase = new DataBase();
                dataBase.ConnectDB();

                dtSet      = dataBase.GetDataSet(queryStr, paraList.ToArray()); // クエリ実行
                totalCount = dtSet.Tables[0].Rows.Count;                        // 全体件数

                foreach (DataRow row in dtSet.Tables[0].Rows)
                {
                    SearchResult sr = new SearchResult(row);
                    if (Condition.OutPut_Chk || sr.CheckOutPut(Condition.Process))
                    {
                        SearchResults.Add(sr);
                    }
                }

                ResultCount = SearchResults.Count.ToString() + "/" + totalCount.ToString();

                dataBase.DisconnectDB();
            }
            catch (Exception ex)
            {
                SearchErrorMessage = Resources.TextResource.ErrorGetSearchResult;
            }
            finally
            {
                if (dataBase != null)
                {
                    dataBase.DisconnectDB();
                }
                if (dtSet != null)
                {
                    dtSet.Dispose();
                }
            }
        }
示例#12
0
        /// <summary>
        /// Legacy API for accessing the query builder.
        /// </summary>
        public static string GetSql(StructuredQuery query, bool debugQueries = false)
        {
            var settings = new QuerySettings
            {
                DebugMode = debugQueries,
                Hint      = "QueryBuilder.GetSql"
            };

            QueryBuild result = GetSql(query, settings);

            return(result.Sql);
        }
示例#13
0
        /// <summary>
        /// 進捗データ取得
        /// </summary>
        /// <param name="dpyno">伝票No</param>
        /// <param name="process">工程</param>
        /// <remarks>
        /// 作成者    :  kawana
        /// 作成日    :  2019/10/24
        /// </remarks>
        private void GetMgmt(string dpyno, string process)
        {
            DataSet  dtSet    = null;
            DataBase dataBase = null;

            try
            {
                dataBase = new DataBase();
                List <object> paraList = new List <object>();
                string        sqlStr   = QueryBuild.GetJushihanMgmt(dpyno, ref paraList);

                dataBase.ConnectDB();
                dtSet = dataBase.GetDataSet(sqlStr, paraList.ToArray());

                dataBase.DisconnectDB();

                foreach (DataRow row in dtSet.Tables[0].Rows)
                {
                    string cd           = row["PROCESS_CD"].ToString();
                    bool   disabled_flg = (cd != process);
                    switch (cd)
                    {
                    case Constants.PROCESS_SPNSEIZO:
                        Spnseizo = new Register(row, disabled_flg);
                        break;

                    case Constants.PROCESS_SPNKENSA:
                        Spnkensa = new Register(row, disabled_flg);
                        break;

                    case Constants.PROCESS_GYOUMU:
                        Gyoumu = new Register(row, disabled_flg);
                        break;
                    }
                }
            }
            catch (Exception ex)
            {
                ErrorGetMgmtMessage = Resources.TextResource.ErrorGetMgmt;
            }
            finally
            {
                if (dataBase != null)
                {
                    dataBase.DisconnectDB();
                }
                if (dtSet != null)
                {
                    dtSet.Dispose();
                }
            }
        }
示例#14
0
        private void RunTest(string testName, Action <StructuredQuery> additionalProcessing = null, int derivedTypesTempTableThreshold = -1)
        {
            XmlDocument doc = GetTestCaseXml( );

            XmlNode test = doc.DocumentElement.SelectSingleNode("Test[@name='" + testName + "']");

            if (test == null)
            {
                throw new Exception("Test not found in Query tests.xml: " + testName);
            }

            // Load test
            StructuredQuery query;

            try
            {
                query = StructuredQueryHelper.FromXml(test.FirstChild);
            }
            catch (Exception ex)
            {
                throw new Exception("Failed to load query for " + testName, ex);
            }

            query.TimeZoneName = TimeZoneHelper.SydneyTimeZoneName;

            if (additionalProcessing != null)
            {
                additionalProcessing(query);
            }

            // Generate SQL
            var settings = new QuerySettings {
                Hint = "test", DebugMode = true, DerivedTypesTempTableThreshold = derivedTypesTempTableThreshold
            };
            QueryBuild result = QueryBuilder.GetSql(query, settings);
            string     sql    = result.Sql;

            sql = Canonical(sql);

            // Get expected results
            XmlNode selectSingleNode = test.SelectSingleNode("Expect/text()");

            if (selectSingleNode != null)
            {
                string expected = Canonical(selectSingleNode.Value);
                expected = expected.Replace("{userResource}", new EntityRef("core", "userResource").Id.ToString(CultureInfo.InvariantCulture));
                Assert.AreEqual(expected, sql, "Generated SQL did not match expected.");
            }

            StructuredQueryHelper.ToXml(query);
        }
示例#15
0
        [Ignore]        // Blocking layer has been disabled for this cache.
        public void Test_EnsureCached_TwoThreads(bool resultIsUserSpecific, bool runAsDifferentUser, bool expectedToCache)
        {
            CachingQueryRunner      cachingQueryRunner;
            Mock <IQuerySqlBuilder> mockQuerySqlBuilder;
            Mock <IQueryRunner>     mockQueryRunner;
            IQueryRunner            queryRunner;
            StructuredQuery         structuredQuery;
            QuerySettings           settings1;
            QuerySettings           settings2;
            QueryBuild           queryBuild;
            QueryResult          result;
            IQuerySqlBuilder     queryBuilder;
            IUserRuleSetProvider userRuleSetProvider = MockUserRuleSetProvider( );

            structuredQuery     = new StructuredQuery( );
            settings1           = new QuerySettings( );
            settings1.RunAsUser = 1;
            settings2           = new QuerySettings( );
            settings2.RunAsUser = runAsDifferentUser ? 2 : 1;
            queryBuild          = new QueryBuild( );
            result = new QueryResult(queryBuild);
            queryBuild.DataReliesOnCurrentUser = resultIsUserSpecific;

            mockQuerySqlBuilder = new Mock <IQuerySqlBuilder>(MockBehavior.Strict);
            mockQuerySqlBuilder.Setup(x => x.BuildSql(It.IsAny <StructuredQuery>( ), It.IsNotNull <QuerySqlBuilderSettings>( ))).Returns(queryBuild);
            queryBuilder = mockQuerySqlBuilder.Object;

            mockQueryRunner = new Mock <IQueryRunner>(MockBehavior.Strict);
            mockQueryRunner.Setup(x => x.ExecutePrebuiltQuery(structuredQuery, It.IsNotNull <QuerySettings>(), It.IsNotNull <QueryBuild>( )))
            .Returns(() =>
            {
                Thread.Sleep(100);
                return(result);
            })
            .Verifiable( );
            queryRunner        = mockQueryRunner.Object;
            cachingQueryRunner = new CachingQueryRunner(queryRunner, userRuleSetProvider, queryBuilder);

            Task task1 = Task.Factory.StartNew(() => cachingQueryRunner.ExecuteQuery(structuredQuery, settings1));

            Thread.Sleep(1);   // BlockIfPending can handle overlapping, but no coincident requests
            Task task2 = Task.Factory.StartNew(() => cachingQueryRunner.ExecuteQuery(structuredQuery, settings2));

            Task.WaitAll(task1, task2);

            int calls = expectedToCache ? 1 : 2;

            mockQueryRunner.Verify(x => x.ExecutePrebuiltQuery(structuredQuery, It.IsNotNull <QuerySettings>(), It.IsNotNull <QueryBuild>( )), Times.Exactly(calls));
            mockQueryRunner.VerifyAll( );
        }
示例#16
0
        /// <summary>
        /// 進捗データ登録
        /// </summary>
        /// <param name="dpyno">伝票No</param>
        /// <param name="process">工程コード</param>
        /// <param name="uid">ユーザーID</param>
        /// <returns>処理成否</returns>
        /// <remarks>
        /// 作成者    :  nakao
        /// 作成日    :  2019/09/01
        /// </remarks>
        public bool RegistMgmt(string dpyno, string process, string uid)
        {

            DataSet dtSet = null;
            DataBase dataBase = null;

            try
            {
                string sqlStr;
                Register register;
                List<object> paraList = new List<object>();

                dataBase = new DataBase();
                dataBase.ConnectDB();

                // サブ1登録
                register = GetTargetRegister(process, Constants.PROCESS_SUB1);
                sqlStr = QueryBuild.RegistSeihanMgmt(register, dpyno, process, Constants.PROCESS_SUB1, uid, ref paraList);
                dataBase.CommitData(sqlStr, paraList.ToArray());

                // 編集と検査はサブ2登録
                if (process.Equals(Constants.PROCESS_HENSHU) || process.Equals(Constants.PROCESS_KENSA))
                {
                    paraList.Clear();
                    register = GetTargetRegister(process, Constants.PROCESS_SUB2);
                    sqlStr = QueryBuild.RegistSeihanMgmt(register, dpyno, process, Constants.PROCESS_SUB2, uid, ref paraList);
                    dataBase.CommitData(sqlStr, paraList.ToArray());
                }

                dataBase.DisconnectDB();

            }
            catch
            {
                return false;
            }
            finally
            {
                if (dataBase != null)
                {
                    dataBase.DisconnectDB();
                }
                if (dtSet != null)
                {
                    dtSet.Dispose();
                }
            }

            return true;
        }
示例#17
0
        /// <summary>
        /// ヘッダ情報取得
        /// </summary>
        /// <param name="customer">得意先コード</param>
        /// <remarks>
        /// 作成者    :  sesaki
        /// 作成日    :  2019/11/21
        /// </remarks>
        private void GetHeader(string customer)
        {
            DataSet  dtSet    = null;
            DataBase dataBase = null;

            try
            {
                dataBase = new DataBase();
                List <object> paraList = new List <object>();
                string        sqlStr;
                if (GurabiaCustomer.IsTokan(customer))
                {
                    sqlStr = QueryBuild.GetGurabiaHeaderTokan(DPY_NO, ref paraList);
                }
                else
                {
                    sqlStr = QueryBuild.GetGurabiaHeaderToyo(DPY_NO, ref paraList);
                }

                dataBase.ConnectDB();
                dtSet = dataBase.GetDataSet(sqlStr, paraList.ToArray());

                DataRow row = dtSet.Tables[0].Rows[0];

                CUSTMER_RNM = row["CUSTMER_RNM"].ToString();
                SUBNEGA_NO  = row["SUBNEGA_NO"].ToString();
                BURANDO_NM  = row["BURANDO_NM"].ToString();
                SYOHIN_NM   = row["SYOHIN_NM"].ToString();
                KAN_NM      = row["KAN_NM"].ToString();
                KSKBN_NM    = row["KSKBN_NM"].ToString();
                COLOR_NM    = row["COLOR_NM"].ToString();

                dataBase.DisconnectDB();
            }
            catch (Exception ex)
            {
            }
            finally
            {
                if (dataBase != null)
                {
                    dataBase.DisconnectDB();
                }
                if (dtSet != null)
                {
                    dtSet.Dispose();
                }
            }
        }
        /// <summary>
        /// Constructor.
        /// </summary>
        public CachingQuerySqlBuilderValue(StructuredQuery originalQuery, QueryBuild queryResult)
        {
            if (originalQuery == null)
            {
                throw new ArgumentNullException("originalQuery");
            }
            if (queryResult == null)
            {
                throw new ArgumentNullException("queryResult");
            }

            OriginalQuery = originalQuery;
            QueryResult   = queryResult;
            CacheTime     = DateTime.Now;
        }
示例#19
0
        /// <summary>
        /// CSV出力データ取得
        /// </summary>
        /// <returns>取得処理成否</returns>
        /// <remarks>
        /// 作成者    :  nakao
        /// 作成日    :  2019/09/01
        /// </remarks>
        public bool GetCsvData()
        {
            // 出力条件が正しければCSVデータ取得
            if (Condition.ValidateOutput() == false)
            {
                return(false);
            }

            DataSet  dtSet    = null;
            DataBase dataBase = null;

            try
            {
                dataBase = new DataBase();
                List <object> paraList = new List <object>();
                string        queryStr = QueryBuild.GetSeihanCsv(Condition, ref paraList);

                dataBase.ConnectDB();

                dtSet = dataBase.GetDataSet(queryStr, paraList.ToArray());  // クエリ実行
                DataTable table = dtSet.Tables[0];

                CsvData = Utilities.DataTableToCsv(table);

                dataBase.DisconnectDB();

                CsvName = Utilities.GetCsvFileName(Resources.TextResource.ProgressSeihan);

                return(true);
            }
            catch (Exception ex)
            {
                CsvErrorMessage = Resources.TextResource.ErrorOutputCsv;
                return(false);
            }
            finally
            {
                if (dataBase != null)
                {
                    dataBase.DisconnectDB();
                }
                if (dtSet != null)
                {
                    dtSet.Dispose();
                }
            }
        }
示例#20
0
        /// <summary>
        /// Refer to CachingQuerySqlBuilder.MutateResultToMatchCurrentQuery
        /// </summary>
        internal static QueryResult MutateResultToMatchCurrentQuery(CachingQueryRunnerValue cacheValue, StructuredQuery currentQuery)
        {
            if (cacheValue == null)
            {
                throw new ArgumentNullException("cacheValue");
            }
            if (currentQuery == null)
            {
                throw new ArgumentNullException("currentQuery");
            }

            // Clone result
            QueryBuild  queryBuild = CachingQuerySqlBuilder.MutateResultToMatchCurrentQuery(cacheValue.QueryResult.QueryBuild, cacheValue.OriginalQuery, currentQuery);
            QueryResult result     = cacheValue.QueryResult.ShallowClone(queryBuild);

            return(result);
        }
示例#21
0
        //[Explicit]
        //[Test]
        //[TestCaseSource( "RunReport_GetTestData" )]
        public void RunQuery(TenantInfo tenant, long reportId, string reportName)
        {
            using (tenant.GetTenantAdminContext( ))
            {
                // Load report
                Report report = Factory.GraphEntityRepository.Get <Report>(reportId, ReportHelpers.ReportPreloaderQuery);
                Assert.That(report, Is.Not.Null, "Report entity not null");

                // Convert to structured query
                StructuredQuery structuredQuery = Factory.ReportToQueryConverter.Convert(report);

                Assert.That(structuredQuery, Is.Not.Null, "StructuredQuery entity not null");

                // Check for errors reported during conversionduring reporting (e.g. missing schema entities can't be found)
                if (structuredQuery.InvalidReportInformation != null)
                {
                    foreach (var pair in structuredQuery.InvalidReportInformation)
                    {
                        Assert.That(pair.Value, Is.Empty, "Errors detected for " + pair.Key);
                    }
                }

                // Build query
                QuerySqlBuilderSettings buildSettings = new QuerySqlBuilderSettings {
                    Hint          = "ReportTenantTests",
                    SecureQuery   = true,
                    SupportPaging = true
                };
                QueryBuild queryBuild = Factory.NonCachedQuerySqlBuilder.BuildSql(structuredQuery, buildSettings);
                Assert.That(queryBuild, Is.Not.Null, "QueryBuild entity not null");
                Assert.That(queryBuild.Sql, Is.Not.Null, "QueryBuild.Sql entity not null");

                // Run query
                QuerySettings runSettings = new QuerySettings
                {
                    Hint          = "ReportTenantTests",
                    FirstRow      = 0,
                    PageSize      = 1,
                    SecureQuery   = true,
                    SupportPaging = true
                };
                QueryResult result = Factory.Current.ResolveNamed <IQueryRunner>(Factory.NonCachedKey).ExecutePrebuiltQuery(structuredQuery, runSettings, queryBuild);
                //QueryResult result = Factory.NonCachedQueryRunner.ExecutePrebuiltQuery( structuredQuery, runSettings, queryBuild );
                Assert.That(result, Is.Not.Null, "QueryResult entity not null");
            }
        }
示例#22
0
        /// <summary>
        /// ヘッダ情報取得
        /// </summary>
        /// <remarks>
        /// 作成者    :  nakao
        /// 作成日    :  2019/09/01
        /// </remarks>
        private void GetHeader()
        {
            DataSet  dtSet    = null;
            DataBase dataBase = null;

            try
            {
                dataBase = new DataBase();
                List <object> paraList = new List <object>();
                string        sqlStr   = QueryBuild.GetSeihanHeader(DPY_NO, ref paraList);

                dataBase.ConnectDB();
                dtSet = dataBase.GetDataSet(sqlStr, paraList.ToArray());

                DataRow row = dtSet.Tables[0].Rows[0];

                SUBNEGA_NO = row["SUBNEGA_NO"].ToString();
                CMNY       = row["CMNY_NM"].ToString();
                CMKBN      = row["CMKBN_NM"].ToString();
                BURANDO_NM = row["BURANDO_NM"].ToString();
                SYOHIN_NM  = row["SYOHIN_NM"].ToString();
                KAN_NM     = row["KAN_NM"].ToString();
                ZUMEN_NO   = row["ZUMEN_NO"].ToString();
                HAN_KBN    = row["HAN_KBN"].ToString();
                COLOR_NM   = row["COLOR_NM"].ToString();
                KSKBN      = row["KSKBN_NM"].ToString();
                KSZAI      = row["KOSEIZAI"].ToString();
                KSBUSU     = row["GOKEI_CT"].ToString();

                dataBase.DisconnectDB();
            }
            catch (Exception ex)
            {
            }
            finally
            {
                if (dataBase != null)
                {
                    dataBase.DisconnectDB();
                }
                if (dtSet != null)
                {
                    dtSet.Dispose();
                }
            }
        }
示例#23
0
        /// <summary>
        /// 工程リスト取得
        /// </summary>
        /// <remarks>
        /// 作成者    :  kawana
        /// 作成日    :  2019/10/24
        /// </remarks>
        private void GetProcessList()
        {
            DataSet  dtSet             = null;
            DataBase dataBase          = null;
            List <SelectListItem> list = new List <SelectListItem>();

            try
            {
                dataBase = new DataBase();
                string sqlStr = QueryBuild.GetProcess(Constants.PRODUCT_JUSHIHAN);

                dataBase.ConnectDB();
                dtSet = dataBase.GetDataSet(sqlStr, null);


                foreach (DataRow row in dtSet.Tables[0].Rows)
                {
                    list.Add(new SelectListItem
                    {
                        Text  = row["PROCESS_NM"].ToString(),
                        Value = row["PROCESS_CD"].ToString()
                    });
                }

                dataBase.DisconnectDB();
            }
            catch (Exception ex)
            {
                ConditionErrorMessage = Resources.TextResource.ErrorGetCondition;
            }
            finally
            {
                ProcessList = new SelectList(list, "Value", "Text");
                if (dataBase != null)
                {
                    dataBase.DisconnectDB();
                }
                if (dtSet != null)
                {
                    dtSet.Dispose();
                }
            }
        }
示例#24
0
        public void Test_EnsureCached(bool resultIsUserSpecific, bool runAsDifferentUser, bool expectedToCache)
        {
            CachingQueryRunner      cachingQueryRunner;
            Mock <IQuerySqlBuilder> mockQuerySqlBuilder;
            Mock <IQueryRunner>     mockQueryRunner;
            IQueryRunner            queryRunner;
            StructuredQuery         structuredQuery;
            QuerySettings           settings;
            QueryBuild           queryBuild;
            QueryResult          result;
            IQuerySqlBuilder     queryBuilder;
            IUserRuleSetProvider userRuleSetProvider = MockUserRuleSetProvider( );

            structuredQuery    = new StructuredQuery( );
            settings           = new QuerySettings( );
            settings.RunAsUser = 1;
            queryBuild         = new QueryBuild( );
            result             = new QueryResult(queryBuild);
            queryBuild.DataReliesOnCurrentUser = resultIsUserSpecific;

            mockQuerySqlBuilder = new Mock <IQuerySqlBuilder>(MockBehavior.Strict);
            mockQuerySqlBuilder.Setup(x => x.BuildSql(It.IsAny <StructuredQuery>( ), It.IsNotNull <QuerySqlBuilderSettings>( ))).Returns(queryBuild);
            queryBuilder = mockQuerySqlBuilder.Object;

            mockQueryRunner = new Mock <IQueryRunner>(MockBehavior.Strict);
            mockQueryRunner.Setup(x => x.ExecutePrebuiltQuery(structuredQuery, settings, It.IsNotNull <QueryBuild>( )))
            .Returns(() => result)
            .Verifiable( );
            queryRunner        = mockQueryRunner.Object;
            cachingQueryRunner = new CachingQueryRunner(queryRunner, userRuleSetProvider, queryBuilder);

            cachingQueryRunner.ExecuteQuery(structuredQuery, settings);
            if (runAsDifferentUser)
            {
                settings.RunAsUser = 2;
            }
            cachingQueryRunner.ExecuteQuery(structuredQuery, settings);

            int calls = expectedToCache ? 1 : 2;

            mockQueryRunner.Verify(x => x.ExecutePrebuiltQuery(structuredQuery, settings, It.IsNotNull <QueryBuild>( )), Times.Exactly(calls));
            mockQueryRunner.VerifyAll( );
        }
示例#25
0
        /// <summary>
        /// 担当者リスト取得
        /// </summary>
        /// <remarks>
        /// 作成者    :  nakao
        /// 作成日    :  2019/09/01
        /// </remarks>
        private void GetEmployeeList()
        {
            DataSet dtSet = null;
            DataBase dataBase = null;
            List<SelectListItem> list = new List<SelectListItem>();

            try
            {
                dataBase = new DataBase();
                string sqlStr = QueryBuild.GetEmployee();

                dataBase.ConnectDB();
                dtSet = dataBase.GetDataSet(sqlStr, null);

                foreach (DataRow row in dtSet.Tables[0].Rows)
                {
                    list.Add(new SelectListItem
                    {
                        Text = row["EMPLOYEE_NM"].ToString(),
                        Value = row["EMPLOYEE_CD"].ToString()
                    });
                }

                dataBase.DisconnectDB();
            }
            catch (Exception ex)
            {
            }
            finally
            {
                EmployeeList = new SelectList(list, "Value", "Text");
                if (dataBase != null)
                {
                    dataBase.DisconnectDB();
                }
                if (dtSet != null)
                {
                    dtSet.Dispose();
                }
            }

        }
示例#26
0
        /// <summary>
        /// 進捗データ登録
        /// </summary>
        /// <param name="dpyno">伝票No</param>
        /// <param name="process">工程</param>
        /// <param name="uid">ユーザーID</param>
        /// <returns>処理成否</returns>
        /// <remarks>
        /// 作成者    :  kawana
        /// 作成日    :  2019/10/24
        /// </remarks>
        public bool RegistMgmt(string dpyno, string process, string uid)
        {
            DataSet  dtSet    = null;
            DataBase dataBase = null;

            try
            {
                string        sqlStr;
                Register      register;
                List <object> paraList = new List <object>();

                dataBase = new DataBase();
                dataBase.ConnectDB();

                register = GetTargetRegister(process);
                sqlStr   = QueryBuild.RegistJushihanMgmt(register, dpyno, process, Constants.PROCESS_SUB1, uid, ref paraList);
                dataBase.CommitData(sqlStr, paraList.ToArray());



                dataBase.DisconnectDB();
            }
            catch
            {
                return(false);
            }
            finally
            {
                if (dataBase != null)
                {
                    dataBase.DisconnectDB();
                }
                if (dtSet != null)
                {
                    dtSet.Dispose();
                }
            }

            return(true);
        }
示例#27
0
        public void Test_EnsureDifferentInstancesCanCacheMatch( )
        {
            CachingQueryRunner   cachingQueryRunner;
            Mock <IQueryRunner>  mockQueryRunner;
            IQueryRunner         queryRunner;
            QuerySettings        settings;
            QueryBuild           queryBuild;
            QueryResult          result;
            IQuerySqlBuilder     queryBuilder        = MockQuerySqlBuilder( );
            IUserRuleSetProvider userRuleSetProvider = MockUserRuleSetProvider( );

            StructuredQuery sq1 = ReportHelpers.BuildFilterQuery("Name='test1'", new EntityRef("test:person"), true);

            sq1.SelectColumns.Add(new SelectColumn {
                Expression = new ResourceExpression(sq1.RootEntity, "core:name")
            });

            StructuredQuery sq2 = ReportHelpers.BuildFilterQuery("Name='test1'", new EntityRef("test:person"), true);

            sq2.SelectColumns.Add(new SelectColumn {
                Expression = new ResourceExpression(sq2.RootEntity, "core:name")
            });

            settings   = new QuerySettings( );
            queryBuild = new QueryBuild( );
            result     = new QueryResult(queryBuild);

            mockQueryRunner = new Mock <IQueryRunner>(MockBehavior.Strict);
            mockQueryRunner.Setup(x => x.ExecutePrebuiltQuery(sq1, settings, It.IsNotNull <QueryBuild>( )))
            .Returns(() => result)
            .Verifiable( );
            queryRunner        = mockQueryRunner.Object;
            cachingQueryRunner = new CachingQueryRunner(queryRunner, userRuleSetProvider, queryBuilder);

            cachingQueryRunner.ExecuteQuery(sq1, settings);
            cachingQueryRunner.ExecuteQuery(sq2, settings);

            mockQueryRunner.Verify(x => x.ExecutePrebuiltQuery(sq1, settings, It.IsNotNull <QueryBuild>( )), Times.Exactly(1));
            mockQueryRunner.VerifyAll( );
        }
示例#28
0
        /// <summary>
        /// The problem: we want to cache queries, but the StructuredQueries contain GUIDs that vary from call to call.
        /// The CachingQuerySqlBuilderKey happily handles this via StructuredQuery.CacheKeyToken. However, the result contains
        /// references back to the original query. And stuff down stream relies on having the correct GUIDs in the referenced columns.
        /// The solution: we take a shallowing copy of the result, and substutite in the columns from our current query.
        /// </summary>
        internal static QueryBuild MutateResultToMatchCurrentQuery(QueryBuild queryBuild, StructuredQuery originalQuery, StructuredQuery currentQuery)
        {
            if (queryBuild == null)
            {
                throw new ArgumentNullException("queryBuild");
            }
            if (originalQuery == null)
            {
                throw new ArgumentNullException("originalQuery");
            }
            if (currentQuery == null)
            {
                throw new ArgumentNullException("currentQuery");
            }

            // Clone result
            QueryBuild result = queryBuild.ShallowClone();

            result.Columns          = MutateColumnList(result.Columns, originalQuery.SelectColumns, currentQuery.SelectColumns);
            result.AggregateColumns = MutateColumnList(result.AggregateColumns, originalQuery.SelectColumns, currentQuery.SelectColumns);
            return(result);
        }
示例#29
0
        /// <summary>
        /// Add all database query parameters.
        /// </summary>
        private void AddAllParameters(QuerySettings settings, QueryBuild result, IDatabaseContext context, IDbDataAdapter adapter)
        {
            IDbCommand selectCommand = adapter.SelectCommand;

            selectCommand.AddParameter(TenantParameterName, DatabaseType.IdentifierType, RequestContext.TenantId);
            if (result.DataReliesOnCurrentUser)
            {
                selectCommand.AddParameter(UserParameterName, DatabaseType.IdentifierType, settings.RunAsUser);
            }

            if (result.EntityBatchDataTable != null)
            {
                selectCommand.AddTableValuedParameter(EntityBatchParameterName, result.EntityBatchDataTable);
            }

            AddQuickSearchParameter(settings, selectCommand);
            AddFauxRelationshipParameters(settings, selectCommand);
            AddRootIdFilterParameter(settings, selectCommand);

            if (settings.ValueList != null)
            {
                selectCommand.AddStringListParameter("@valueList", settings.ValueList);
            }

            if (settings.SupportPaging)
            {
                SetPage(settings.FirstRow, settings.FirstRow + settings.PageSize, selectCommand);
            }

            if (result.SharedParameters != null)
            {
                foreach (KeyValuePair <ParameterValue, string> parameter in result.SharedParameters)
                {
                    selectCommand.AddParameter(parameter.Value, parameter.Key.Type, parameter.Key.Value);
                }
            }
        }
示例#30
0
        /// <summary>
        /// Executes the specified query.
        /// </summary>
        /// <param name="query">The query. This cannot be null.</param>
        /// <param name="settings">Settings to control SQL generation. Defaults are used if omitted.</param>
        /// <param name="queryBuild">The prebuilt query.</param>
        /// <returns>
        /// A <see cref="QueryResult"/> containing the query and related details.
        /// </returns>
        /// <exception cref="ArgumentNullException">
        /// <paramref name="query"/> cannot be null.
        /// </exception>
        public QueryResult ExecutePrebuiltQuery(StructuredQuery query, QuerySettings settings, QueryBuild queryBuild)
        {
            if (query == null)
            {
                throw new ArgumentNullException(nameof(query));
            }
            if (queryBuild == null)
            {
                throw new ArgumentNullException(nameof(queryBuild));
            }
            if (settings == null)
            {
                settings = new QuerySettings
                {
                    Hint = "QueryEngine"
                };
            }

            using (Profiler.Measure("QueryRunner.ExecuteQuery {0}", settings.Hint))
            {
                QueryResult result = new QueryResult(queryBuild);
                string      sql;
                DataTable   dataTable;

                if (settings.ResultSchemaOnly)
                {
                    // This is a bit of a hack. Ideally someone who wants schema only could just use the SqlBuilder .. but that isn't working.
                    // Likely due to the mutate that's currently happening in the runner caching layer. Maybe we can move it to the builder layer.
                    return(result);
                }

                // Check security settings (ok if it happens twice)
                VerifySecuritySettings(settings);

                sql = queryBuild.Sql;

                using (IDatabaseContext context = DatabaseProvider.GetContext())
                {
                    IDbDataAdapter adapter = context.CreateDataAdapter(sql);
                    using (adapter as IDisposable)
                    {
                        try
                        {
                            AddAllParameters(settings, queryBuild, context, adapter);

                            dataTable = new DataTable();
                            FillFromAdapter(dataTable, context, adapter, settings);
                        }
                        catch (SqlException ex)
                        {
                            if (ex.ErrorCode == ExceededCpuErrorCode && ex.Class == SeverityLevelResourceExhausted)     // Exceeded report CPU limit
                            {
                                EventLog.Application.WriteTrace("{0}\r\nFailed to run report query due to Cpu Limit exceeded. Hint: {1}\r\n\r\n{2}\r\n\r\n{3}", ex.Message, settings.Hint, ex, sql);
                                throw new ExceededReportCpuLimitException(ex);
                            }

                            EventLog.Application.WriteError("{0}\r\nFailed to run report query due to sql error. Hint: {1}\r\n\r\n{2}\r\n\r\n{3}", ex.Message, settings.Hint, ex, sql);
                            throw;
                        }
                        catch (Exception ex)
                        {
                            EventLog.Application.WriteError("{0}\r\nFailed to run report query. Hint: {1}\r\n\r\n{2}\r\n\r\n{3}", ex.Message, settings.Hint, ex, sql);
                            throw;
                        }
                    }

                    StructureViewHelper.SecureStructureViewData(settings, result, dataTable);

                    MetadataHelper.CaptureMetadata(query, settings, result, dataTable);
                }

                // Note: identify cache dependencies after getting SQL, so that any calculations are resolved into the structured query.
                IdentifyCacheDependencies(queryBuild.FinalStructuredQuery, settings);

                return(result);
            }
        }