示例#1
0
        public string GetCalculatedColumnFieldName(string fieldName, bool useDateStats, bool dontAggregate = false, bool useFieldAlias = false)
        {
            using (new DebugTimer("CalculatedColumnHelper.GetCalculatedColumnFieldName"))
            {
                string originalFieldName = fieldName;
                fieldName = originalFieldName;

                if (!QueryHelpers.IsCalculatedColumnCompiled(fieldName))
                {
                    fieldName = new SqlExpressionParser().ConvertToSql(fieldName);
                }

                fieldName = ExpandCalculatedColumn(new Stack <string>(), fieldName, useFieldAlias);

                var columnsInCalculation = FindColumnsInCalculatedField(fieldName);
                var statsTable           = GetStatsTable(useDateStats);
                //fieldName = FixCalculatedFieldNameToUseActualFieldNames(fieldName, statsTable, ref columnsInCalculation, useFieldAlias);
                Dictionary <string, string> tempFieldNameLookups;
                fieldName = FixCalculatedFieldNameToUseTemporaryFieldNames(fieldName, statsTable, ref columnsInCalculation, out tempFieldNameLookups, useFieldAlias);

                if (!QueryHelpers.IsCalculatedColumnCompiled(fieldName))
                {
                    fieldName = new SqlExpressionParser().ConvertToSql(fieldName);
                }

                var shouldAggregate = !dontAggregate && fieldName.Contains(' ');


                foreach (var foundColumn in columnsInCalculation)
                {
                    var    aggregate         = QueryHelpers.GetAggregate(foundColumn.Key.FieldAggregationMethod);
                    string replaceColumnName = tempFieldNameLookups[foundColumn.Value];
                    if (shouldAggregate)
                    {
                        replaceColumnName = GenerateAggregateColumnSql(aggregate, replaceColumnName);
                    }
                    fieldName = ReplaceFieldName(new Stack <string>(), fieldName, foundColumn.Value, replaceColumnName);
                }

                return(fieldName);
            }
        }
示例#2
0
        public virtual bool FieldNameIsValid(string fieldName)
        {
            try
            {
                if (!QueryHelpers.IsCalculatedColumnCompiled(fieldName))
                {
                    var result = new SqlExpressionParser().ConvertToSql(fieldName);
                }

                if (SqlInjectionChecker.HasInjection(fieldName))
                {
                    return(false);
                }
            }
            catch
            {
                return(false);
            }
            return(true);
        }
示例#3
0
        public IDbQueryFetchable <TSelect> Select <TSelect>(Expression <Func <T, TSelect> > fields)
        {
            var pp = SqlExpressionParser.Parse(fields.Body, this);

            throw new NotImplementedException();
        }
        /// <summary>
        /// Finds nested calculated columns in a fieldname and replaces the referenced calculated column with the full formula
        /// </summary>
        /// <param name="fieldName"></param>
        /// <returns></returns>
        public string ExpandCalculatedColumn(Stack <string> existingFieldNames, string fieldName, bool useFieldAlias = false)
        {
            var result     = fieldName;
            int recursions = 3;

            while (recursions > 0) // needed for synonym columns
            {
                recursions--;

                var foundColumns = FindColumnsInCalculatedField(result, throwOnNoMatch: false);
                if (!foundColumns.Any(x => x.Key.IsCalculated))
                {
                    break;
                }

                var calculatedColumns = new List <KeyValuePair <ReportColumnMapping, string> >();

                // either the fieldname has a formula
                // or the field name is a reference to another field
                foreach (var found in foundColumns)
                {
                    if (found.Key.IsCalculated)
                    {
                        if (existingFieldNames.Contains(fieldName))
                        {
                            throw new ArgumentException("Recursion detected on field " + fieldName, "fieldName");
                        }
                        existingFieldNames.Push(fieldName);

                        string newFieldName = found.Key.FieldName;

                        if (useFieldAlias && found.Key.FieldAggregationMethod != FieldAggregationMethod.Average)
                        {
                            newFieldName = GetFieldAlias(found.Key);
                        }
                        else
                        {
                            var nestedColumns = FindColumnsInCalculatedField(found.Value, throwOnNoMatch: false);
                            if (nestedColumns.Any())
                            {
                                if (nestedColumns.Count > 1)
                                {
                                    calculatedColumns.Add(found);
                                }
                                else if (nestedColumns.First().Key.IsCalculated)
                                {
                                    calculatedColumns.Add(found);
                                }
                            }
                        }

                        if (QueryHelpers.IsCalculatedColumn(newFieldName) && !QueryHelpers.IsCalculatedColumnCompiled(newFieldName))
                        {
                            newFieldName = new SqlExpressionParser().ConvertToSql(newFieldName);
                        }

                        result = ReplaceFieldName(existingFieldNames, result, found.Value, newFieldName);
                        existingFieldNames.Pop();
                    }
                }
            }

            return(result);
        }
示例#5
0
        public void GetClosingBracketIndex_WithCase_ReturnsExpected(string input, int openingIndex, int expected)
        {
            var result = new SqlExpressionParser().GetClosingBracketIndex(input, openingIndex);

            Assert.AreEqual(expected, result);
        }