private IQuery BuildConditions(ICollection <uint> keys, IDatabaseTableData tableData)
        {
            if (tableData.TableDefinition.Condition == null)
            {
                return(Queries.Empty());
            }

            IMultiQuery query = Queries.BeginTransaction();

            query.Add(BuildConditionsDeleteQuery(keys, tableData));
            List <IConditionLine> conditions = new();
            int sourceType = tableData.TableDefinition.Condition.SourceType;

            foreach (var entity in tableData.Entities)
            {
                if (entity.Conditions == null)
                {
                    continue;
                }

                int sourceGroup = 0;
                int sourceEntry = 0;
                int sourceId    = 0;

                if (tableData.TableDefinition.Condition.SourceEntryColumn != null &&
                    entity.GetCell(tableData.TableDefinition.Condition.SourceEntryColumn) is DatabaseField <long>
                    entryCell)
                {
                    sourceEntry = (int)entryCell.Current.Value;
                }

                if (tableData.TableDefinition.Condition.SourceGroupColumn != null &&
                    entity.GetCell(tableData.TableDefinition.Condition.SourceGroupColumn) is DatabaseField <long>
                    groupCell)
                {
                    sourceGroup = (int)groupCell.Current.Value;
                }

                if (tableData.TableDefinition.Condition.SourceIdColumn != null &&
                    entity.GetCell(tableData.TableDefinition.Condition.SourceIdColumn) is DatabaseField <long>
                    idCell)
                {
                    sourceId = (int)idCell.Current.Value;
                }

                foreach (var condition in entity.Conditions)
                {
                    conditions.Add(new AbstractConditionLine(sourceType, sourceGroup, sourceEntry, sourceId, condition));
                }
            }
            query.Add(conditionQueryGenerator.BuildInsertQuery(conditions));

            return(query.Close());
        }
Ejemplo n.º 2
0
        public static IList CreateMultiQuery(List <string> queryString, out string msgException)
        {
            IList result = null;

            lock (lockObj)
            {
                ISession session = NHibernateHelper.GetCurrentSession();
                msgException = string.Empty;
                try
                {
                    IMultiQuery mq = session.CreateMultiQuery();
                    foreach (string query in queryString)
                    {
                        IQuery q = session.CreateQuery(query);
                        mq.Add(q);
                    }
                    result = mq.List();
                }
                catch (Exception ex)
                {
                    msgException = ex.StackTrace;
                    LogHelper.Log(ex);
                }
                return(result);
            }
        }
Ejemplo n.º 3
0
            /// <summary>
            /// Adds specified query to batch, returning a token that can be used to retrieve the result set.
            /// </summary>
            /// <param name="query"></param>
            /// <returns></returns>
            internal object Add(IQuery query)
            {
                var token = new object();

                _multiQuery.Add(query);
                _tokens.Add(token);
                return(token);
            }
Ejemplo n.º 4
0
        private IQuery GenerateInsertQuery(ICollection <uint> keys, IDatabaseTableData tableData)
        {
            if (keys.Count == 0)
            {
                return(Queries.Empty());
            }

            IMultiQuery query = Queries.BeginTransaction();

            query.Add(GenerateDeleteQuery(tableData.TableDefinition, keys));

            if (tableData.Entities.Count == 0)
            {
                return(query.Close());
            }

            var columns = tableData.TableDefinition.TableColumns
                          .Select(c => c.Value)
                          .Where(col => !col.IsMetaColumn && !col.IsConditionColumn)
                          .GroupBy(columns => columns.ForeignTable ?? tableData.TableDefinition.TableName)
                          .ToDictionary(g => g.Key, g => g.ToList());

            HashSet <EntityKey> entityKeys = new();
            Dictionary <string, List <Dictionary <string, object?> > > inserts = new(tableData.Entities.Count);

            List <string> duplicates = new List <string>();
            var           comparer   = new EntityComparer(tableData.TableDefinition);

            foreach (var entity in tableData.Entities.OrderBy(t => t, comparer))
            {
                bool duplicate = tableData.TableDefinition.PrimaryKey != null && !entityKeys.Add(new EntityKey(entity, tableData.TableDefinition));
                foreach (var table in columns)
                {
                    var cells = table.Value.ToDictionary(c => c.DbColumnName, c =>
                    {
                        var cell = entity.GetCell(c.DbColumnName) !;
                        if (c.AutogenerateComment != null && cell is DatabaseField <string> sField)
                        {
                            var evaluator = new DatabaseExpressionEvaluator(calculatorService, parameterFactory, tableData.TableDefinition, c.AutogenerateComment !);
                            var comment   = evaluator.Evaluate(entity);
                            if (comment is string s)
                            {
                                return(s.AddComment(sField.Current.Value));
                            }
                        }
                        return(cell.Object);
                    });
                    if (table.Key != tableData.TableDefinition.TableName)
                    {
                        if (cells.All(c => c.Value == null))
                        {
                            continue;
                        }

                        var foreignKeys = tableData.TableDefinition.ForeignTableByName[table.Key].ForeignKeys;
                        for (int i = 0; i < foreignKeys.Length; ++i)
                        {
                            cells[foreignKeys[i]] = entity.GetTypedValueOrThrow <long>(tableData.TableDefinition.PrimaryKey ![i]);
Ejemplo n.º 5
0
        private void BuildInsert(IMultiQuery query, ISmartScriptLine[] serializedScript, IConditionLine[] serializedConditions)
        {
            if (serializedScript.Length == 0)
            {
                return;
            }

            var lines = serializedScript.Select(s => GenerateSingleSai(query, s));

            query.Table(SmartScriptTableName).BulkInsert(lines);

            query.BlankLine();

            query.Add(conditionQueryGenerator.BuildDeleteQuery(new IDatabaseProvider.ConditionKey(
                                                                   SmartConstants.ConditionSourceSmartScript,
                                                                   null,
                                                                   script.EntryOrGuid,
                                                                   (int)script.SourceType)));
            query.Add(conditionQueryGenerator.BuildInsertQuery(serializedConditions));
        }
Ejemplo n.º 6
0
        public async Task <IQuery> GenerateSql(MetaSolutionSQL item)
        {
            IMultiQuery multiQuery = Queries.BeginTransaction();

            foreach (var subitem in item.ItemsToGenerate)
            {
                multiQuery.Add(await sqlGeneratorRegistry.Value.GenerateSql(subitem));
            }

            return(multiQuery.Close());
        }
        private void BuildInsert(IMultiQuery query)
        {
            var(serializedScript, serializedConditions) = scriptExporter.ToDatabaseCompatibleSmartScript(script);

            if (serializedScript.Length == 0)
            {
                return;
            }

            var lines = serializedScript.Select(s => GenerateSingleSai(query, s));

            query.Table("smart_scripts").BulkInsert(lines);

            query.BlankLine();

            query.Add(conditionQueryGenerator.BuildDeleteQuery(new IDatabaseProvider.ConditionKey(
                                                                   SmartConstants.ConditionSourceSmartScript,
                                                                   null,
                                                                   script.EntryOrGuid,
                                                                   (int)script.SourceType)));
            query.Add(conditionQueryGenerator.BuildInsertQuery(serializedConditions));
        }
        public async Task <IQuery> GenerateSql(SolutionFolderItem item)
        {
            IMultiQuery query = Queries.BeginTransaction();

            query.Comment(item.MyName);
            foreach (ISolutionItem i in item.Items)
            {
                if (i.IsExportable)
                {
                    query.Add(await registry.Value.GenerateSql(i));
                }
            }

            return(query.Close());
        }
Ejemplo n.º 9
0
        public void CanNotRetrieveCriteriaResultWithUnknownKey()
        {
            using (ISession session = OpenSession())
            {
                IMultiQuery multiQuery = session.CreateMultiQuery();

                multiQuery.Add("firstCriteria", session.CreateQuery("from Item"));

                try
                {
                    IList firstResult = (IList)multiQuery.GetResult("unknownKey");
                    Assert.Fail("This should've thrown an InvalidOperationException");
                }
                catch (InvalidOperationException)
                {
                }
                catch (Exception)
                {
                    Assert.Fail("This should've thrown an InvalidOperationException");
                }
            }
        }
        public void CanNotRetrieveQueryResultWithUnknownKey()
        {
            using (ISession session = OpenSession())
            {
                IMultiQuery multiQuery = session.CreateMultiQuery();

                multiQuery.Add("firstQuery", session.CreateSQLQuery("select * from ITEM").AddEntity(typeof(Item)));

                try
                {
                    multiQuery.GetResult("unknownKey");
                    Assert.Fail("This should've thrown an InvalidOperationException");
                }
                catch (InvalidOperationException)
                {
                }
                catch (Exception)
                {
                    Assert.Fail("This should've thrown an InvalidOperationException");
                }
            }
        }
        public void CanNotAddQueryWithKeyThatAlreadyExists()
        {
            using (ISession session = OpenSession())
            {
                IMultiQuery multiQuery = session.CreateMultiQuery();

                IQuery firstQuery = session.CreateSQLQuery("select * from ITEM where Id < :id").AddEntity(typeof(Item))
                                    .SetInt32("id", 50);

                try
                {
                    IQuery secondQuery = session.CreateSQLQuery("select * from ITEM").AddEntity(typeof(Item));
                    multiQuery.Add("first", firstQuery).Add("second", secondQuery);
                }
                catch (InvalidOperationException)
                {
                }
                catch (Exception)
                {
                    Assert.Fail("This should've thrown an InvalidOperationException");
                }
            }
        }
Ejemplo n.º 12
0
        public void CanNotAddCriteriaWithKeyThatAlreadyExists()
        {
            using (ISession session = OpenSession())
            {
                IMultiQuery multiQuery = session.CreateMultiQuery();

                IQuery firstQuery = session.CreateQuery("from Item i where i.Id < :id")
                                    .SetInt32("id", 50);

                try
                {
                    IQuery secondQuery = session.CreateQuery("from Item");
                    multiQuery.Add("first", firstQuery).Add("second", secondQuery);
                }
                catch (InvalidOperationException)
                {
                }
                catch (Exception)
                {
                    Assert.Fail("This should've thrown an InvalidOperationException");
                }
            }
        }
Ejemplo n.º 13
0
        public void CanAddIQueryWithKeyAndRetrieveResultsWithKey()
        {
            CreateItems();

            using (ISession session = OpenSession())
            {
                IMultiQuery multiQuery = session.CreateMultiQuery();

                IQuery firstQuery = session.CreateQuery("from Item i where i.Id < :id")
                                    .SetInt32("id", 50);

                IQuery secondQuery = session.CreateQuery("from Item");

                multiQuery.Add("first", firstQuery).Add("second", secondQuery);

                IList secondResult = (IList)multiQuery.GetResult("second");
                IList firstResult  = (IList)multiQuery.GetResult("first");

                Assert.Greater(secondResult.Count, firstResult.Count);
            }

            RemoveAllItems();
        }
        private IQuery GenerateInsertQuery(ICollection <uint> keys, IDatabaseTableData tableData)
        {
            if (keys.Count == 0)
            {
                return(Queries.Empty());
            }

            IMultiQuery query = Queries.BeginTransaction();

            query
            .Table(tableData.TableDefinition.TableName)
            .WhereIn(tableData.TableDefinition.TablePrimaryKeyColumnName, keys.Distinct())
            .Delete();

            if (tableData.Entities.Count == 0)
            {
                return(query.Close());
            }

            var columns = tableData.TableDefinition.TableColumns
                          .Select(c => c.Value)
                          .Where(col => !col.IsMetaColumn && !col.IsConditionColumn)
                          .ToList();

            HashSet <EntityKey> entityKeys = new();
            List <Dictionary <string, object?> > inserts = new(tableData.Entities.Count);
            List <string> duplicates = new List <string>();
            var           comparer   = new EntityComparer(tableData.TableDefinition);

            foreach (var entity in tableData.Entities.OrderBy(t => t, comparer))
            {
                bool duplicate = tableData.TableDefinition.PrimaryKey != null && !entityKeys.Add(new EntityKey(entity, tableData.TableDefinition));
                var  cells     = columns.ToDictionary(c => c.DbColumnName, c =>
                {
                    var cell = entity.GetCell(c.DbColumnName) !;
                    if (c.AutogenerateComment != null && cell is DatabaseField <string> sField)
                    {
                        var evaluator = new DatabaseExpressionEvaluator(calculatorService, parameterFactory, tableData.TableDefinition, c.AutogenerateComment !);
                        var comment   = evaluator.Evaluate(entity);
                        if (comment is string s)
                        {
                            return(s.AddComment(sField.Current.Value));
                        }
                    }
                    return(cell.Object);
                });

                if (duplicate)
                {
                    duplicates.Add("(" + string.Join(", ", cells.Values) + ")");
                }
                else
                {
                    inserts.Add(cells);
                }
            }

            query.Table(tableData.TableDefinition.TableName)
            .BulkInsert(inserts);

            if (duplicates.Count > 0)
            {
                query.Comment("duplicates, cannot insert:");
                foreach (var line in duplicates)
                {
                    query.Comment(line);
                }
            }

            query.Add(BuildConditions(keys, tableData));

            return(query.Close());
        }
Ejemplo n.º 15
0
        public IQuery GenerateInsertQuery(IReadOnlyList <DatabaseKey> keys, IDatabaseTableData tableData)
        {
            if (keys.Count == 0)
            {
                return(Queries.Empty());
            }

            IMultiQuery query = Queries.BeginTransaction();

            query.Add(GenerateDeleteQuery(tableData.TableDefinition, keys));

            if (tableData.Entities.Count == 0)
            {
                return(query.Close());
            }

            var columns = tableData.TableDefinition.TableColumns
                          .Select(c => c.Value)
                          .Where(col => !col.IsMetaColumn && !col.IsConditionColumn)
                          .GroupBy(columns => columns.ForeignTable ?? tableData.TableDefinition.TableName)
                          .ToDictionary(g => g.Key, g => g.ToList());

            HashSet <EntityKey> entityKeys = new();
            Dictionary <string, List <Dictionary <string, object?> > > inserts = new(tableData.Entities.Count);

            List <string> duplicates = new List <string>();
            var           comparer   = new EntityComparer(tableData.TableDefinition);

            foreach (var entity in tableData.Entities.OrderBy(t => t, comparer))
            {
                if (!entity.Phantom && !keys.Contains(entity.Key))
                {
                    continue;
                }

                bool duplicate = tableData.TableDefinition.PrimaryKey != null && !entityKeys.Add(new EntityKey(entity, tableData.TableDefinition));
                foreach (var table in columns)
                {
                    bool isDefault   = true;
                    bool isMainTable = table.Key == tableData.TableDefinition.TableName;
                    var  cells       = table.Value.ToDictionary(c => c.DbColumnName, c =>
                    {
                        var cell = entity.GetCell(c.DbColumnName) !;
                        if (c.AutogenerateComment != null && cell is DatabaseField <string> sField)
                        {
                            var evaluator = new DatabaseExpressionEvaluator(calculatorService, parameterFactory, tableData.TableDefinition, c.AutogenerateComment !);
                            var comment   = evaluator.Evaluate(entity);
                            if (comment is string s)
                            {
                                return(s.AddComment(sField.Current.Value));
                            }
                        }

                        var columnDefinition = tableData.TableDefinition.TableColumns[cell.FieldName];
                        if (!columnDefinition.CanBeNull && cell.Object is null)
                        {
                            return(columnDefinition.Default ?? 0L);
                        }
                        if (columnDefinition.CanBeNull && cell.Object is null)
                        {
                            return(null);
                        }
                        if (!isMainTable && columnDefinition.IsTypeFloat && ((cell.Object == null && columnDefinition.Default != null) || cell.Object != null && !cell.Object.Equals(columnDefinition.Default ?? 0f)))
                        {
                            isDefault = false;
                        }
                        if (!isMainTable && columnDefinition.IsTypeLong && ((cell.Object == null && columnDefinition.Default != null) || cell.Object != null && !cell.Object.Equals(columnDefinition.Default ?? 0L)))
                        {
                            isDefault = false;
                        }
                        return(FixUnixTimestampAndNullability(columnDefinition, cell.Object));
                    });
                    if (!isMainTable)
                    {
                        if (isDefault)
                        {
                            continue;
                        }

                        var newCells    = new Dictionary <string, object?>();
                        var foreignKeys = tableData.TableDefinition.ForeignTableByName ![table.Key].ForeignKeys;
Ejemplo n.º 16
0
        /// <summary>
        /// Add this query to a multiquery
        /// </summary>
        /// <param name="session">an <c>ISession</c> shared by all queries in the multiquery</param>
        /// <param name="multiquery">the <c>IMultiQuery</c> that will receive the newly created query</param>
        internal void AddQuery(ISession session, IMultiQuery multiquery)
        {
            IQuery query = CreateQuery(session);

            multiquery.Add(query);
        }
		/// <summary>
		/// Add this query to a multiquery
		/// </summary>
		/// <param name="session">an <c>ISession</c> shared by all queries in the multiquery</param>
		/// <param name="multiquery">the <c>IMultiQuery</c> that will receive the newly created query</param>
		internal void AddQuery(ISession session, IMultiQuery multiquery) 
		{
			IQuery query = CreateQuery(session);
			multiquery.Add(query);
		}
Ejemplo n.º 18
0
 internal Query(IMultiQuery multiQuery, string query)
 {
     multiQuery.Add(this);
     QueryString = query;
 }