Example #1
0
        public void ApplyFilter_WithCase_ReturnsExpected(string value, string format, string expected)
        {
            var filters = new RenderFilterFactory().GetFilters();
            var column  = new ReportColumnMapping()
            {
                MetaData = new List <ReportColumnMetaDataValue>()
                {
                    new ReportColumnMetaDataValue()
                    {
                        Name  = "DataFormat",
                        Value = format
                    }
                }
            };

            if (format == "Boolean")
            {
                column.DbType = DbType.Boolean;
            }

            var result = value;

            filters.ForEach(x => result = x.ApplyFilter(result, column, null));

            Assert.AreEqual(expected, result);
        }
Example #2
0
 protected override void BuildGroupBy(
     SelectQuery query,
     ReportColumnMapping groupByColumn,
     MappedSearchRequest request)
 {
     base.BuildGroupBy(query, request.SummarizeByColumn, request);
 }
Example #3
0
        /// <summary>
        /// for calculated columns, replace [] table names with actual names
        /// </summary>
        /// <returns></returns>
        public string GetReplacedFieldName(ReportColumnMapping col, string mainTable)
        {
            var    fieldName      = col.FieldName;
            string mainTableAlias = QueryHelpers.GetTableAlias(mainTable);

            return(GetReplacedFieldName(fieldName, mainTableAlias));
        }
 protected override void BuildGroupBy(SelectQuery query, ReportColumnMapping groupByColumn, MappedSearchRequest request)
 {
     if (request.SummarizeByColumn != null)
     {
         query.GroupBy(string.Empty, GetFieldAlias(request.SummarizeByColumn, request));
     }
 }
Example #5
0
        public virtual bool GroupByIsChildTable(string tableAlias, ReportColumnMapping groupByColumn)
        {
            var table = _tableMappings.GetAllTables().First(x => x.Alias == tableAlias);

            var isChild = TableIsChildOfTable(table.KnownTableName, groupByColumn.KnownTable);

            return(isChild);
        }
 protected virtual Column GetColumSelector(
     ReportColumnMapping col,
     bool dontAggregate = false,
     bool useFieldAlias = false)
 {
     // todo: this is a hack
     return(_dataSourceComponents.SearchQueryBuilder.GetColumnSelector(col, null, dontAggregate: dontAggregate, useFieldAlias: useFieldAlias));
 }
Example #7
0
 private int GetPrecision(ReportColumnMapping columnDefinition)
 {
     if (columnDefinition.MetaData != null)
     {
         return(columnDefinition.MetaData.GetInt("Precision"));
     }
     return(0);
 }
        protected override void BuildGroupBy(SelectQuery query, ReportColumnMapping groupByColumn, MappedSearchRequest request)
        {
            var actionSpecIdColumn = QueryHelpers.GetColumnMapping(_transposeKeyColumnId);

            query.GroupBy(_transposeStatsTableAlias, groupByColumn.FieldName)
            .GroupBy(_transposeStatsTableAlias, actionSpecIdColumn.FieldName);

            StatsQueryHelpers.AddTemporalAggregationGroupBy(query, request.TemporalAggregation, _constants.StatsDateDbField);
        }
Example #9
0
        public virtual string ApplyFilter(string value, ReportColumnMapping columnMapping, SearchResultRow row)
        {
            if (CanApply(value, columnMapping, row))
            {
                return(TryFormatValue(value, columnMapping, row));
            }

            return(value);
        }
        private CacheItem <ReportColumnMapping> NewCacheItem(ReportColumnMapping columnMapping)
        {
            var result = new CacheItem <ReportColumnMapping>
            {
                ExpiresTime = GetExpiryTime(columnMapping),
                Value       = columnMapping
            };

            return(result);
        }
        public override ReportColumnMapping CreateColumnMapping(int dataSourceId, ReportColumnMapping columnMapping, IReportColumnMappingValidator columnValidator)
        {
            if (!columnValidator.FieldNameIsValid(columnMapping.FieldName))
            {
                throw new Exception("Column FieldName is invalid");
            }

            columnMapping.DataSourceTypeId = dataSourceId;
            _reportColumnMappingCreationService.InsertReportColumnMapping(columnMapping);
            return(_reportColumnMappingQueryService.GetReportColumnMappingsById(dataSourceId, new[] { columnMapping.Id }).FirstOrDefault());
        }
Example #12
0
        protected override string TryFormatValue(string value, ReportColumnMapping columnMapping, SearchResultRow row)
        {
            double parsed;

            if (double.TryParse(value, out parsed))
            {
                //return "?" + parsed.ToString("0.00");
                return(parsed.ToString("0.00"));
            }
            return(value);
        }
 protected virtual Dictionary <ReportColumnMapping, string> GetNestedColumns(ReportColumnMapping calcCol)
 {
     if (calcCol.NestedColumns == null)
     {
         // get the generated field name
         var fieldName    = GetColumSelector(calcCol).FullName;
         var foundColumns = _calculatedColumnHelper.FindColumnsInCalculatedField(fieldName);
         calcCol.NestedColumns = foundColumns;
     }
     return(calcCol.NestedColumns);
 }
Example #14
0
        public virtual bool IsSelectableForGroupBy(ReportColumnMapping column, ReportColumnMapping groupBy)
        {
            var groupByTable = groupBy.KnownTable;

            if (GetTableType(groupByTable) == TableType.Stats)
            {
                return(false);
            }

            return(true);
        }
Example #15
0
        public virtual List <ColumnDefinition> GetAllSelectableColumnDefinitions(int dataSourceId, int?organizationId, int?groupBy = null)
        {
            ReportColumnMapping groupByColumn = null;

            if (groupBy != null)
            {
                groupByColumn = GetColumnMappings(dataSourceId, new[] { groupBy.Value }).Single();
            }

            return(GetAllColumnMappings(dataSourceId, organizationId).Where(x => IsSelectable(x, groupByColumn)).Select(x => new ColumnDefinition(x)).ToList());
        }
        public override Column GetColumnSelector(ReportColumnMapping col, MappedSearchRequest request, bool dontAggregate = false, bool useFieldAlias = false)
        {
            var result = _dataSourceComponents.QueryBuilderBase.GetColumnSelector(col, request, dontAggregate: dontAggregate, useFieldAlias: useFieldAlias);

            if (result.Field.Name.StartsWith("_C_"))
            {
                result.Field.Name = _constants.CountKeyAlias;
            }

            return(result);
        }
        protected override string GetFieldAlias(ReportColumnMapping column, MappedSearchRequest request)
        {
            var result = QueryHelpers.GetFieldName(column);

            // to allow selecting both min and max together (not working with custom columns - its complicated)
            // depends on DefaultStatsQueryBuilder.GetColumnSelector()
//            if (RestrictGroupBy(request).Id != column.Id && result != _constants.CountKeyAlias)
//            {
//                result += "_" + column.FieldAggregationMethod;
//            }
            return(result);
        }
Example #18
0
        public override void BuildFrom(
            SelectQuery query,
            List <ReportColumnMapping> selectedColumns,
            ReportColumnMapping groupByColumn,
            ReportColumnMapping sortByColumn,
            MappedSearchRequest request)
        {
            var fromTableName = request.SummarizeByColumn.KnownTable;
            var fromTable     = _tableMappings.GetTableMapping(fromTableName);

            query.From(fromTable.DbTableName, fromTable.Alias);
        }
        public void InsertReportColumnMapping(ReportColumnMapping value)
        {
            using (var scope = _reportColumnMappingRepository.CreateTransaction())
            {
                _reportColumnMappingRepository.Add(value, scope);
                scope.Commit();
            }

            // reload mappings
            _columnProviderCacheService.ClearMappings(value.DataSourceTypeId, value.OrganizationId);
            _reportColumnMappingQueryService.GetReportColumnMappingsByOrganizationId(value.DataSourceTypeId, value.OrganizationId); // to ensure that all columns are reloaded
        }
Example #20
0
        protected override string TryFormatValue(string value, ReportColumnMapping columnMapping, SearchResultRow row)
        {
            double parsed;

            if (value.Contains(".") && double.TryParse(value, out parsed))
            {
                var toPrecision = Math.Round(parsed, columnMapping.MetaData.GetInt(MetaDataKey));
                return(toPrecision.ToString());
            }

            return(value);
        }
Example #21
0
        private void UpdateMetaData(ReportColumnMapping entity, ReportColumnMapping value)
        {
            entity.MetaData.Clear();

            foreach (var update in value.MetaData)
            {
                entity.MetaData.Add(new ReportColumnMetaDataValue()
                {
                    Name  = update.Name,
                    Value = update.Value
                });
            }
        }
        private DateTime GetExpiryTime(ReportColumnMapping columnMapping)
        {
            var existingForOrg = _cache.Where(x =>
                                              x.Value.Value.DataSourceTypeId == columnMapping.DataSourceTypeId &&
                                              x.Value.Value.OrganizationId == columnMapping.OrganizationId).Select(x => x.Value)
                                 .FirstOrDefault();

            if (existingForOrg != null)
            {
                return(existingForOrg.ExpiresTime);
            }
            return(DateTime.Now.AddMinutes(_cacheTimeMinutes));
        }
Example #23
0
        public override void BuildFrom(
            SelectQuery query,
            List <ReportColumnMapping> selectedColumns,
            ReportColumnMapping groupByColumn,
            ReportColumnMapping sortByColumn,
            MappedSearchRequest request)
        {
            // idea here is to be able to get a key which can be joined on, so select from the table we're building the CTE from
            // then join on the tables required to get to the join key (which can be used as the group key)

            _rootTableName = request.GroupByColumn.KnownTable;
            var fromTable = _tableMappings.GetTableMapping(_fromTableName);

            var addedTables = new List <string>();

            if (CanJoinTables(_fromTableName, _rootTableName))
            {
                query.From(fromTable.DbTableName, fromTable.Alias);
            }
            else
            {
                var graphBuilder      = new TableRelationshipGraphBuilder();
                var relationshipGraph = graphBuilder.Build(_tableMappings.GetAllTableRelationships(), _rootTableName);

                // todo : use path
                //var path = graphBuilder.GetPathFromTableToRoot(relationshipGraph, _fromTableName);

                var distance = graphBuilder.GetDistance(relationshipGraph, _fromTableName);

                query.From(fromTable.DbTableName, fromTable.Alias);

                string currentTableName = fromTable.KnownTableName;
                while (distance > 1)
                {
                    var potentialNodes = graphBuilder.GetByDistance(relationshipGraph, distance - 1);
                    var parentNode     = potentialNodes.SingleOrDefault(x => x.Relations.Any(y => y.TableName == currentTableName));
                    if (parentNode == null)
                    {
                        throw new Exception(string.Format("Could not find a relationship between {0} and {1}", currentTableName, relationshipGraph.TableName));
                    }
                    JoinTables(query, parentNode.TableName, currentTableName);
                    currentTableName = parentNode.TableName;
                    distance--;
                    addedTables.Add(parentNode.TableName);
                    if (CanJoinTables(_fromTableName, currentTableName) && CanJoinTables(currentTableName, _rootTableName))
                    {
                        break;
                    }
                }
            }
        }
Example #24
0
        protected override string TryFormatValue(string value, ReportColumnMapping columnMapping, SearchResultRow row)
        {
            long parsed;

            if (long.TryParse(value, out parsed))
            {
                if (parsed > 0)
                {
                    var date = parsed.DateTimeFromUnixTime();
                    return(date.ToString("dd/MM/yyyy HH:mm:ss"));
                }
            }
            return(value);
        }
        protected override void BuildOrderBy(SelectQuery query, ReportColumnMapping sortColumn, MappedSearchRequest request)
        {
            bool isSummarizing = request.SummarizeByColumn != null;

            if (isSummarizing)
            {
                var dir = request.SortDescending ? OrderDir.Desc : OrderDir.Asc;
                query.OrderBy(string.Empty, _dataSourceComponents.QueryHelpers.GetFieldAlias(request.SortByColumn), dir);
            }
            else
            {
                query.OrderBy(string.Empty, "_ROW");
            }
        }
Example #26
0
        /// <summary>
        /// Gets the Column with alias for non calculated columns
        /// Gets the Column without alias for calculated columns and handles the conversion of calculated columns to sql
        /// For calculated colums, the column will be expanded to a full formula
        /// Sets the result on the column mapping so that it doesnt need to be re-calculated - this works with the cache
        /// </summary>
        public virtual Column GetColumnSelector(ReportColumnMapping col, MappedSearchRequest request, bool dontAggregate = false, bool useFieldAlias = false)
        {
            var cached = col.CalculatedValues.GetColumnTableAndField(dontAggregate, useFieldAlias);

            if (cached != null)
            {
                return(new Column(cached[0], cached[1]));
            }

            var result = GetColumSelectorInternal(col, dontAggregate, useFieldAlias);

            col.CalculatedValues.SetColumnTableAndField(dontAggregate, useFieldAlias, result.TableAlias, result.Field.Name);

            return(result);
        }
Example #27
0
        public virtual string GetFieldAlias(ReportColumnMapping column)
        {
            // this is just to help us debug sql, we could just use the id alone
            var rgx          = new Regex("[^a-zA-Z0-9_]");
            var friendlyName = rgx.Replace(column.UniqueName, "");

            var result = "c" + friendlyName + "_" + column.Id;

            if (column.ActionSpecId > 0 && IsTransposeStatColumn(column))
            {
                result += "_" + column.ActionSpecId;
            }

            return(result);
        }
        public virtual string GetDataJoinTable(ReportColumnMapping groupByColumn, List <TableRelationship> statsRelationships, TableRelationshipGraphBuilder graphBuilder)
        {
            var statsJoinTables = statsRelationships
                                  .Select(x => x.Table1 is StatsTableMapping ? x.Table2.KnownTableName : x.Table1.KnownTableName)
                                  .ToList();

            // find the nearest stats table to the group by table.
            var graph = graphBuilder.Build(_tableMappings.GetAllTableRelationships(), groupByColumn.KnownTable);

            graphBuilder.TrimToTables(graph, statsJoinTables);
            var dataTables = graphBuilder.GetAllTables(graph).Distinct().ToList();

            dataTables = dataTables.OrderBy(x => graphBuilder.GetDistance(graph, x)).ToList();

            var joinTable = dataTables.FirstOrDefault(statsJoinTables.Contains);

            return(joinTable);
        }
        // Build
        public override void BuildFrom(
            SelectQuery query,
            List <ReportColumnMapping> selectedColumns,
            ReportColumnMapping groupByColumn,
            ReportColumnMapping sortByColumn,
            MappedSearchRequest request)
        {
            var statsRelationships = _tableMappings.GetAllTableRelationships()
                                     .Where(x => x.Table1 is StatsTableMapping || x.Table2 is StatsTableMapping)
                                     .ToList();


            // get the data table which joins onto the stats table
            var graphBuilder  = new TableRelationshipGraphBuilder();
            var dataJoinTable = _dataSourceComponents.StatsQueryBuilder.GetDataJoinTable(request.GroupByColumn, statsRelationships, graphBuilder);

            //-- Find out which stats table or view we need to query to satisfy the requested temporal
            // aggregation and type of date range.
            var statsTableName = GetStatsTableName(
                _statsTableName,
                dataJoinTable,
                request.TemporalAggregation,
                request.DateRangeType,
                request.DateStart,
                request.DateEnd);

            query.From(statsTableName, _statsTableAlias);
            JoinTables(query, dataJoinTable, _statsTableName);

            // join up to the root table
            var addedTables = new Dictionary <string, bool> {
                { dataJoinTable, false }
            };

            _dataSourceComponents.StatsQueryBuilder.AddDataTableJoinsUpToRoot(query, dataJoinTable, graphBuilder, addedTables);

            var currencyColumn = GetCurrencyColumn();

            if (currencyColumn != null && !addedTables.ContainsKey(currencyColumn.KnownTable))
            {
                var relationshipGraph = graphBuilder.Build(_tableMappings.GetAllTableRelationships(), _constants.RootTableName);
                AddFromTableJoin(query, groupByColumn, currencyColumn.KnownTable, ref addedTables, graphBuilder, relationshipGraph);
            }
        }
Example #30
0
        public virtual void BuildFrom(
            SelectQuery query,
            List <ReportColumnMapping> selectedColumns,
            ReportColumnMapping groupByColumn,
            ReportColumnMapping sortByColumn,
            MappedSearchRequest request)
        {
            var tables = request.SelectedAndDependantColumns.Select(x => x.KnownTable).ToList();

            tables.Add(groupByColumn.KnownTable);
            tables = tables.Distinct().ToList();

            var currencyColumn = GetCurrencyColumn();

            if (currencyColumn != null && !tables.Contains(currencyColumn.KnownTable))
            {
                tables.Add(currencyColumn.KnownTable);
            }

            var rootTableMapping = _tableMappings.GetTableMapping(_constants.RootTableName);

            query.From(rootTableMapping.DbTableName, rootTableMapping.Alias);

            var graphBuilder = new TableRelationshipGraphBuilder();
            // bulild a graph of the table relationships to calculate the distance from the root table
            // include missing tables needed for joins
            // order the tables by distance
            var relationshipGraph = graphBuilder.Build(_tableMappings.GetAllTableRelationships(), _constants.RootTableName);

            graphBuilder.TrimToTables(relationshipGraph, tables);
            tables = graphBuilder.GetAllTables(relationshipGraph).Union(tables).Distinct().ToList();

            tables = tables.OrderBy(x => graphBuilder.GetDistance(relationshipGraph, x)).ToList();

            // dictionary of TableName, IsAggregated for tables which have been added to the query
            var addedTables = new Dictionary <string, bool> {
                { _constants.RootTableName, false }
            };

            foreach (var table in tables.Distinct())
            {
                AddFromTableJoin(query, groupByColumn, table, ref addedTables, graphBuilder, relationshipGraph);
            }
        }