Example #1
0
        internal override void Execute(QueryContext queryContext, Predicate nextPredicate)
        {
            ChildPredicate.Execute(queryContext, nextPredicate);

            RecordSet resultRecordSet = new RecordSet();

            RecordColumn keyColumn = new RecordColumn(QueryKeyWords.KeyColumn);

            keyColumn.ColumnType            = ColumnType.KeyColumn;
            keyColumn.AggregateFunctionType = AggregateFunctionType.NOTAPPLICABLE;
            keyColumn.DataType = ColumnDataType.String;
            keyColumn.IsHidden = false;
            keyColumn.IsFilled = true;

            resultRecordSet.Columns.Add(keyColumn);

            RecordColumn valueColumn = new RecordColumn(QueryKeyWords.ValueColumn);

            valueColumn.ColumnType            = ColumnType.ValueColumn;
            valueColumn.AggregateFunctionType = AggregateFunctionType.NOTAPPLICABLE;
            valueColumn.DataType = ColumnDataType.CompressedValueEntry;
            valueColumn.IsHidden = true;
            valueColumn.IsFilled = false;

            resultRecordSet.Columns.Add(valueColumn);

            foreach (OrderByArgument orderBy in _orderByArguments)
            {
                RecordColumn column = new RecordColumn(orderBy.AttributeName);
                column.AggregateFunctionType = AggregateFunctionType.NOTAPPLICABLE;
                column.ColumnType            = ColumnType.AttributeColumn;
                column.IsFilled = true;
                column.IsHidden = true;

                resultRecordSet.Columns.Add(column);
            }

            MultiRootTree sortingTree = new MultiRootTree(_orderByArguments, false);

            if (queryContext.InternalQueryResult.Count > 0)
            {
                foreach (string key in queryContext.InternalQueryResult)
                {
                    if (queryContext.CancellationToken != null && queryContext.CancellationToken.IsCancellationRequested)
                    {
                        throw new OperationCanceledException(ExceptionsResource.OperationFailed);
                    }
                    KeyValuesContainer keyValues = new KeyValuesContainer();
                    keyValues.Key = key;

                    bool invalidGroupKey = false;
                    for (int i = 0; i < _orderByArguments.Count; i++)
                    {
                        if (queryContext.CancellationToken != null && queryContext.CancellationToken.IsCancellationRequested)
                        {
                            throw new OperationCanceledException(ExceptionsResource.OperationFailed);
                        }
                        string     attribute  = _orderByArguments[i].AttributeName;
                        CacheEntry cacheentry = queryContext.Cache.GetEntryInternal(key, false);
                        if (cacheentry == null)
                        {
                            invalidGroupKey = true;
                            break;
                        }

                        object attribValue = queryContext.Index.GetAttributeValue(key, attribute, cacheentry.IndexInfo);
                        if (attribValue == null)
                        {
                            invalidGroupKey = true;
                            break;
                        }
                        keyValues.Values[attribute] = attribValue;
                    }

                    if (!invalidGroupKey)
                    {
                        sortingTree.Add(keyValues);
                    }
                }
            }

            //generates RecordSet from tree.
            sortingTree.ToRecordSet(resultRecordSet);

            ReaderResultSet readerResult = new ReaderResultSet();

            readerResult.IsGrouped              = false;
            readerResult.OrderByArguments       = _orderByArguments;
            readerResult.RecordSet              = resultRecordSet;
            queryContext.ResultSet.Type         = QueryType.OrderByQuery;
            queryContext.ResultSet.ReaderResult = readerResult;
        }
Example #2
0
        internal override void Execute(QueryContext queryContext, Predicate nextPredicate)
        {
            RecordSet resultRecordSet = new RecordSet();

            foreach (string columnName in _groupByValueList.ObjectAttributes)
            {
                RecordColumn column = new RecordColumn(columnName);
                column.AggregateFunctionType = AggregateFunctionType.NOTAPPLICABLE;
                column.ColumnType            = ColumnType.AttributeColumn;
                column.IsFilled = true;
                column.IsHidden = false;
                resultRecordSet.Columns.Add(column);
            }
            foreach (AggregateFunctionPredicate afp in _groupByValueList.AggregateFunctions)
            {
                string columnName = afp.GetFunctionType().ToString() + "(" + afp.AttributeName + ")";
                if (resultRecordSet.Columns.Contains(columnName))
                {
                    throw new ArgumentException("Invalid query. Same value cannot be selected twice.");
                }

                RecordColumn column = new RecordColumn(columnName);
                column.IsHidden              = false;
                column.ColumnType            = ColumnType.AggregateResultColumn;
                column.AggregateFunctionType = afp.GetFunctionType();
                column.IsFilled              = true;

                resultRecordSet.Columns.Add(column);
                afp.ChildPredicate = null;
            }

            ChildPredicate.Execute(queryContext, nextPredicate);
            if (_orderingAttributes == null)
            {
                _orderingAttributes = new List <OrderByArgument>(_groupingAttributes.Count);
                foreach (string groupby in _groupingAttributes)
                {
                    OrderByArgument oba = new OrderByArgument();
                    oba.AttributeName = groupby;
                    _orderingAttributes.Add(oba);
                }
            }

            MultiRootTree groupTree = new MultiRootTree(_orderingAttributes, true);

            if (queryContext.InternalQueryResult.Count > 0)
            {
                foreach (string key in queryContext.InternalQueryResult)
                {
                    if (queryContext.CancellationToken != null && queryContext.CancellationToken.IsCancellationRequested)
                    {
                        throw new OperationCanceledException(ExceptionsResource.OperationFailed);
                    }
                    KeyValuesContainer keyValues = new KeyValuesContainer();
                    keyValues.Key = key;
                    bool invalidGroupKey = false;
                    for (int i = 0; i < _orderingAttributes.Count; i++)
                    {
                        if (queryContext.CancellationToken != null && queryContext.CancellationToken.IsCancellationRequested)
                        {
                            throw new OperationCanceledException(ExceptionsResource.OperationFailed);
                        }
                        string     attribute   = _orderingAttributes[i].AttributeName;
                        CacheEntry cacheentry  = queryContext.Cache.GetEntryInternal(key, false);
                        object     attribValue = queryContext.Index.GetAttributeValue(key, attribute, cacheentry.IndexInfo);
                        if (attribValue == null)
                        {
                            invalidGroupKey = true;
                            break;
                        }
                        keyValues.Values[attribute] = attribValue;
                    }
                    if (!invalidGroupKey)
                    {
                        groupTree.Add(keyValues);
                    }
                }
            }

            //add remaining attributes in Group By clause as hidden columns
            foreach (string attribute in _groupingAttributes)
            {
                if (!resultRecordSet.Columns.Contains(attribute))
                {
                    RecordColumn column = new RecordColumn(attribute);
                    column.AggregateFunctionType = AggregateFunctionType.NOTAPPLICABLE;
                    column.ColumnType            = ColumnType.AttributeColumn;
                    column.IsHidden = true;
                    column.IsFilled = true;
                    resultRecordSet.Columns.Add(column);
                }
            }

            //generates RecordSet from tree.
            groupTree.ToRecordSet(resultRecordSet);

            for (int rowID = 0; rowID < resultRecordSet.Rows.Count; rowID++)
            {
                if (queryContext.CancellationToken != null && queryContext.CancellationToken.IsCancellationRequested)
                {
                    throw new OperationCanceledException(ExceptionsResource.OperationFailed);
                }
                List <string> keysList = resultRecordSet.Rows[rowID].Tag as List <string>;
                int           j        = 0;
                queryContext.InternalQueryResult = new Common.Queries.ListQueryResult(queryContext.KeyFilter, queryContext.CompoundFilter, keysList);//Union(keysList as IEnumerable<string>);

                foreach (AggregateFunctionPredicate afp in this._groupByValueList.AggregateFunctions)
                {
                    if (queryContext.CancellationToken != null && queryContext.CancellationToken.IsCancellationRequested)
                    {
                        throw new OperationCanceledException(ExceptionsResource.OperationFailed);
                    }
                    afp.Execute(queryContext, null);
                    int columnId = _groupByValueList.ObjectAttributes.Count + j++;
                    if (resultRecordSet.Columns[columnId].DataType == ColumnDataType.Object)
                    {
                        resultRecordSet.Columns[columnId].DataType = RecordSet.ToColumnDataType(queryContext.ResultSet.AggregateFunctionResult.Value);
                    }

                    resultRecordSet.Rows[rowID][columnId] = queryContext.ResultSet.AggregateFunctionResult.Value;
                }
            }
            ReaderResultSet readerResult = new ReaderResultSet();

            readerResult.IsGrouped        = true;
            readerResult.OrderByArguments = _orderingAttributes;
            readerResult.RecordSet        = resultRecordSet;

            queryContext.ResultSet.Type         = QueryType.GroupByAggregateFunction;
            queryContext.ResultSet.ReaderResult = readerResult;
        }