public string RegisterReader(string clientId, ReaderResultSet resultset)
        {
            string     readerId   = Guid.NewGuid().ToString();
            HashVector recordsets = new HashVector(StringComparer.InvariantCultureIgnoreCase);

            resultset.ClientID = clientId;
            lock (_syncRoot)
            {
                if (!string.IsNullOrEmpty(clientId))
                {
                    if (!_readersList.ContainsKey(clientId))
                    {
                        recordsets[readerId] = resultset;
                    }
                    else
                    {
                        recordsets           = _readersList[clientId];
                        recordsets[readerId] = null;
                    }
                    _readersList[clientId] = recordsets;
                }
                _readers[readerId] = resultset;
            }
            return(readerId);
        }
        public static void BuildReaderChunkResponse(ReaderResultSet resultSet, string RequestId,
                                                    IList <byte[]> _serializedResponse)
        {
            long requestId = Convert.ToInt64(RequestId);

            Alachisoft.NCache.Common.Protobuf.Response response = new Alachisoft.NCache.Common.Protobuf.Response();
            response.requestId    = requestId;
            response.responseType = Common.Protobuf.Response.Type.GET_READER_CHUNK;

            Alachisoft.NCache.Common.Protobuf.GetReaderChunkResponse getReaderChunkResponse =
                new Common.Protobuf.GetReaderChunkResponse();

            IList chunkedResponses = ToProtobufReaderResultSet(resultSet);

            if (chunkedResponses != null)
            {
                int sequence = 1;

                foreach (Alachisoft.NCache.Common.Protobuf.ReaderResultSet readerResult in chunkedResponses)
                {
                    response.sequenceId      = sequence++;
                    response.numberOfChuncks = chunkedResponses.Count;
                    getReaderChunkResponse.readerResultSets = readerResult;
                    response.getReaderChunkResponse         = getReaderChunkResponse;
                    _serializedResponse.Add(Alachisoft.NCache.Common.Util.ResponseHelper.SerializeResponse(response));
                }
            }
            else
            {
                response.getReaderChunkResponse = getReaderChunkResponse;
                _serializedResponse.Add(Alachisoft.NCache.Common.Util.ResponseHelper.SerializeResponse(response));
            }
        }
        public void DisposeReader(string readerId)
        {
            lock (_syncRoot)
            {
                if (_readers.ContainsKey(readerId))
                {
                    int             count     = _readers.Count;
                    ReaderResultSet resultset = _readers[readerId];
                    _readers.Remove(readerId);

                    if (resultset != null)
                    {
                        if (_readersList.Count > 0 && resultset.ClientID != null)
                        {
                            if (_readersList.ContainsKey(resultset.ClientID))
                            {
                                HashVector clientReaders = _readersList[resultset.ClientID];

                                if (clientReaders != null)
                                {
                                    clientReaders.Remove(readerId);
                                }
                            }
                        }
                    }
                }
            }
        }
Beispiel #4
0
        public string RegisterReader(string clientId, ReaderResultSet resultset)
        {
            string     readerId   = Guid.NewGuid().ToString();
            HashVector recordsets = new HashVector(StringComparer.InvariantCultureIgnoreCase);

            resultset.ClientID       = clientId;
            resultset.LastAccessTime = DateTime.Now;
            lock (_syncRoot)
            {
                if (!string.IsNullOrEmpty(clientId))
                {
                    if (!_readersList.ContainsKey(clientId))
                    {
                        recordsets[readerId] = resultset;
                    }
                    else
                    {
                        recordsets           = _readersList[clientId];
                        recordsets[readerId] = null;
                    }
                    _readersList[clientId] = recordsets;
                }
                if (!_readers.ContainsKey(readerId) && _context != null && _context.PerfStatsColl != null)
                {
                    _context.PerfStatsColl.IncrementRunningReaders();
                }
                _readers[readerId] = resultset;
            }

            return(readerId);
        }
Beispiel #5
0
        public void DisposeReader(string readerId)
        {
            lock (_syncRoot)
            {
                if (_readers.ContainsKey(readerId))
                {
                    int             count     = _readers.Count;
                    ReaderResultSet resultset = _readers[readerId];
                    _readers.Remove(readerId);
                    if (resultset != null)
                    {
                        if (_readersList.Count > 0 && resultset.ClientID != null)
                        {
                            if (_readersList.ContainsKey(resultset.ClientID))
                            {
                                HashVector clientReaders = _readersList[resultset.ClientID];

                                if (clientReaders != null)
                                {
                                    clientReaders.Remove(readerId);
                                }
                            }
                        }
                    }
                    if (_context != null && _context.PerfStatsColl != null)
                    {
                        _context.PerfStatsColl.DecrementRunningReaders();
                    }
                }
            }
        }
Beispiel #6
0
        public override void ExecuteCommand(ClientManager clientManager, Alachisoft.NCache.Common.Protobuf.Command command)
        {
            CommandInfo cmdInfo;

            try
            {
                cmdInfo = ParseCommand(command, clientManager);
            }
            catch (Exception exc)
            {
                if (!base.immatureId.Equals("-2"))
                {
                    _serializedResponsePackets.Add(Alachisoft.NCache.Common.Util.ResponseHelper.SerializeExceptionResponse(exc, command.requestID));
                }

                return;
            }

            try
            {
                NCache          nCache = clientManager.CmdExecuter as NCache;
                ReaderResultSet reader = nCache.Cache.GetReaderChunk(cmdInfo.ReaderId, cmdInfo.nextIndex, false, cmdInfo.OperationContext);

                ReaderResponseBuilder.BuildReaderChunkResponse(reader, cmdInfo.RequestId, _serializedResponsePackets);
            }
            catch (Exception exc)
            {
                _serializedResponsePackets.Add(Alachisoft.NCache.Common.Util.ResponseHelper.SerializeExceptionResponse(exc, command.requestID));
            }
        }
Beispiel #7
0
        public virtual ClusteredList <ReaderResultSet> ExecuteReader(string query, IDictionary values, bool getData, int chunkSize, bool isInproc, OperationContext operationContext)
        {
            ReaderResultSet result = InternalCache.Local_ExecuteReader(query, values, getData, chunkSize, isInproc, operationContext);
            ClusteredList <ReaderResultSet> resultList = new ClusteredList <ReaderResultSet>();

            if (result != null)
            {
                resultList.Add(result);
            }
            return(resultList);
        }
Beispiel #8
0
        public override void ExecuteCommand(ClientManager clientManager, Alachisoft.NCache.Common.Protobuf.Command command)
        {
            CommandInfo cmdInfo;
            int         overload;
            int         count     = 0;
            string      exception = null;
            Stopwatch   stopWatch = new Stopwatch();

            stopWatch.Start();
            try
            {
                overload = 1;
                cmdInfo  = ParseCommand(command, clientManager);
            }
            catch (Exception exc)
            {
                if (!base.immatureId.Equals("-2"))
                {
                    _serializedResponsePackets.Add(Alachisoft.NCache.Common.Util.ResponseHelper.SerializeExceptionResponse(exc, command.requestID, command.commandID));
                }

                return;
            }

            try
            {
                NCache          nCache = clientManager.CmdExecuter as NCache;
                ReaderResultSet reader = nCache.Cache.GetReaderChunk(cmdInfo.ReaderId, cmdInfo.nextIndex, false, cmdInfo.OperationContext);
                stopWatch.Stop();
                ReaderResponseBuilder.BuildReaderChunkResponse(reader, cmdInfo.RequestId, _serializedResponsePackets, command.commandID, clientManager.ClientVersion < 4620, out count);
            }
            catch (Exception exc)
            {
                exception = exc.ToString();
                _serializedResponsePackets.Add(Alachisoft.NCache.Common.Util.ResponseHelper.SerializeExceptionResponse(exc, command.requestID, command.commandID));
            }
            finally
            {
                TimeSpan executionTime = stopWatch.Elapsed;
                try
                {
                    if (Alachisoft.NCache.Management.APILogging.APILogManager.APILogManger != null && Alachisoft.NCache.Management.APILogging.APILogManager.EnableLogging)
                    {
                        APILogItemBuilder log = new APILogItemBuilder(MethodsName.GetReaderChunkCommand.ToLower());
                        log.GenerateGetReaderChunkCommand(cmdInfo.ReaderId, count, overload, exception, executionTime, clientManager.ClientID, clientManager.ClientSocketId.ToString());
                    }
                }
                catch
                {
                }
            }
        }
        public static IList BuildReaderChunkResponse(ReaderResultSet resultSet, string RequestId, IList _serializedResponse, int commandId, Boolean isOldClient, out int count)
        {
            count = 0;
            long requestId = Convert.ToInt64(RequestId);

            Alachisoft.NCache.Common.Protobuf.Response response = new Alachisoft.NCache.Common.Protobuf.Response();
            response.requestId    = requestId;
            response.commandID    = commandId;
            response.responseType = Common.Protobuf.Response.Type.GET_READER_CHUNK;

            Alachisoft.NCache.Common.Protobuf.GetReaderChunkResponse getReaderChunkResponse =
                new Common.Protobuf.GetReaderChunkResponse();
            if (resultSet != null && resultSet.RecordSet != null)
            {
                count = resultSet.RecordSet.RowCount;
            }

            IList chunkedResponses = ToProtobufReaderResultSet(resultSet, isOldClient);

            if (chunkedResponses != null && chunkedResponses.Count > 0)
            {
                int sequence = 1;

                foreach (Alachisoft.NCache.Common.Protobuf.ReaderResultSet readerResult in chunkedResponses)
                {
                    response.sequenceId      = sequence++;
                    response.numberOfChuncks = chunkedResponses.Count;
                    getReaderChunkResponse.readerResultSets = readerResult;
                    response.getReaderChunkResponse         = getReaderChunkResponse;
                    _serializedResponse.Add(Alachisoft.NCache.Common.Util.ResponseHelper.SerializeResponse(response));
                }
            }
            else
            {
                response.getReaderChunkResponse = getReaderChunkResponse;
                _serializedResponse.Add(Alachisoft.NCache.Common.Util.ResponseHelper.SerializeResponse(response));
            }
            return(_serializedResponse);
        }
        public ReaderResultSet GetRecordSet(string readerId, int nextIndex, bool inproc, OperationContext context)
        {
            ReaderResultSet      readerChunk      = null;
            IRecordSet           partialRecordSet = null;
            ReaderResultSet      reader           = null;
            RecordRow            row      = null;
            CacheEntry           entry    = null;
            CompressedValueEntry cmpEntry = null;
            int size = 0;

            try
            {
                if (!string.IsNullOrEmpty(readerId))
                {
                    if (_readers.ContainsKey(readerId))
                    {
                        reader = _readers[readerId];
                    }
                }
                if (reader != null)
                {
                    if (nextIndex != 0 && reader.RecordSet.SubsetInfo.LastAccessedRowID == nextIndex)
                    {
                        reader.RecordSet.RemoveRows(reader.RecordSet.SubsetInfo.StartIndex, nextIndex - reader.RecordSet.SubsetInfo.StartIndex);
                    }

                    if (reader.RecordSet.RowCount > 0)
                    {
                        readerChunk      = new ReaderResultSet();
                        partialRecordSet = new RecordSet(reader.RecordSet.GetColumnMetaData());
                        int chunkSize = reader.ChunkSize;
                        reader.RecordSet.SubsetInfo.StartIndex = nextIndex;

                        int nextRowID = nextIndex;
                        while (size <= chunkSize)
                        {
                            row = reader.RecordSet.GetRow(nextRowID++);
                            if (row == null)
                            {
                                break;
                            }
                            row = row.Clone() as RecordRow;
                            if (reader.GetData && !reader.IsGrouped)
                            {
                                entry = _context.CacheImpl.Get(row.GetColumnValue(QueryKeyWords.KeyColumn), context);
                                if (entry != null)
                                {
                                    if (inproc)
                                    {
                                        row.SetColumnValue(QueryKeyWords.ValueColumn, entry.Value);
                                    }
                                    else
                                    {
                                        cmpEntry       = new CompressedValueEntry();
                                        cmpEntry.Value = entry.Value;
                                        if (cmpEntry.Value is CallbackEntry)
                                        {
                                            cmpEntry.Value = ((CallbackEntry)cmpEntry.Value).Value;
                                        }

                                        cmpEntry.Flag = ((CacheEntry)entry).Flag;
                                        row.SetColumnValue(QueryKeyWords.ValueColumn, cmpEntry);
                                    }
                                    size += entry.Size;
                                }


                                if (entry != null)
                                {
                                    partialRecordSet.AddRow(row);
                                    size += row.GetSize();
                                }
                            }
                            else
                            {
                                partialRecordSet.AddRow(row);
                                size += row.GetSize();
                            }
                        }

                        //Value column has been filled if getData is true
                        if (reader.GetData && !reader.IsGrouped)
                        {
                            reader.RecordSet.GetColumnMetaData()[QueryKeyWords.ValueColumn].IsFilled = true;
                        }

                        reader.RecordSet.SubsetInfo.LastAccessedRowID += partialRecordSet.RowCount;
                        readerChunk.RecordSet = partialRecordSet;
                        readerChunk.NextIndex = reader.RecordSet.SubsetInfo.LastAccessedRowID;
                        if (!inproc && _context.Render != null)
                        {
                            readerChunk.NodeAddress = _context.Render.IPAddress.ToString();                                    //server address
                        }
                        readerChunk.OrderByArguments = reader.OrderByArguments;
                        readerChunk.IsGrouped        = reader.IsGrouped;
                        readerChunk.ReaderID         = reader.ReaderID;
                    }
                    else
                    {
                        DisposeReader(reader.ReaderID);
                    }
                }

                return(readerChunk);
            }
            catch (Exception ex)
            {
                if (ex is InvalidReaderException)
                {
                    DisposeReader(reader.ReaderID);
                }
                throw;
            }
        }
Beispiel #11
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;
        }
Beispiel #12
0
        internal void MergeResponse(Common.Net.Address address, CommandResponse response)
        {
            if (_finalResponse == null && response.Type != Alachisoft.NCache.Common.Protobuf.Response.Type.GET_NEXT_CHUNK &&
                response.Type != Alachisoft.NCache.Common.Protobuf.Response.Type.GET_READER_CHUNK &&
                response.Type != Alachisoft.NCache.Common.Protobuf.Response.Type.EXECUTE_READER)
            {
                _finalResponse = response;

                if (response.IsBrokerReset)
                {
                    MergeFailedResponse(response);
                }
            }
            else
            {
                if (response.IsBrokerReset)
                {
                    MergeFailedResponse(response);
                }
                else
                {
                    IDictionaryEnumerator ide = null;
                    switch (response.Type)
                    {
                    case Alachisoft.NCache.Common.Protobuf.Response.Type.ADD_BULK:
                    case Alachisoft.NCache.Common.Protobuf.Response.Type.INSERT_BULK:
                    case Alachisoft.NCache.Common.Protobuf.Response.Type.GET_BULK:
                    case Alachisoft.NCache.Common.Protobuf.Response.Type.REMOVE_BULK:
                        ide = response.KeyValueDic.GetEnumerator();
                        while (ide.MoveNext())
                        {
                            _finalResponse.KeyValueDic[ide.Key] = ide.Value;
                        }
                        break;

                    case Alachisoft.NCache.Common.Protobuf.Response.Type.SEARCH:

                        if ((_finalResponse.ExceptionType == Alachisoft.NCache.Common.Enum.ExceptionType.TYPE_INDEX_NOT_FOUND) ||
                            (_finalResponse.ExceptionType == Alachisoft.NCache.Common.Enum.ExceptionType.ATTRIBUTE_INDEX_NOT_FOUND))
                        {
                            _finalResponse = response;
                            break;
                        }

                        switch (response.ResultSet.AggregateFunctionType)
                        {
                        case Alachisoft.NCache.Common.Enum.AggregateFunctionType.NOTAPPLICABLE:
                            _finalResponse.KeyList.AddRange(response.KeyList);
                            break;

                        default:
                            if (!_finalResponse.ResultSet.IsInitialized)
                            {
                                SetAggregateFunctionResult();
                                _finalResponse.ResultSet.Initialize(_finalResponse.ResultSet);
                            }
                            _finalResponse.ResultSet.Compile(response.ResultSet);
                            break;
                        }
                        break;

                    case Alachisoft.NCache.Common.Protobuf.Response.Type.SEARCH_ENTRIES:

                        if ((_finalResponse.ExceptionType == Alachisoft.NCache.Common.Enum.ExceptionType.TYPE_INDEX_NOT_FOUND) ||
                            (_finalResponse.ExceptionType == Alachisoft.NCache.Common.Enum.ExceptionType.ATTRIBUTE_INDEX_NOT_FOUND))
                        {
                            _finalResponse = response;
                            break;
                        }
                        switch (response.ResultSet.AggregateFunctionType)
                        {
                        case Alachisoft.NCache.Common.Enum.AggregateFunctionType.NOTAPPLICABLE:
                            ide = response.KeyValueDic.GetEnumerator();
                            while (ide.MoveNext())
                            {
                                _finalResponse.KeyValueDic[ide.Key] = ide.Value;
                            }
                            break;

                        default:
                            if (!_finalResponse.ResultSet.IsInitialized)
                            {
                                SetAggregateFunctionResult();
                                _finalResponse.ResultSet.Initialize(_finalResponse.ResultSet);
                            }
                            _finalResponse.ResultSet.Compile(response.ResultSet);
                            break;
                        }
                        break;

                    case Alachisoft.NCache.Common.Protobuf.Response.Type.GET_NEXT_CHUNK:
                        if (_finalResponse == null)
                        {
                            _finalResponse = response;
                        }

                        EnumerationDataChunk chunk = null;
                        if (_chunks.ContainsKey(address))
                        {
                            chunk = _chunks[address];
                        }
                        else
                        {
                            chunk      = new EnumerationDataChunk();
                            chunk.Data = new List <string>();
                            _chunks.Add(address, chunk);
                        }

                        for (int i = 0; i < response.NextChunk.Count; i++)
                        {
                            chunk.Data.AddRange(response.NextChunk[i].Data);
                            chunk.Pointer = response.NextChunk[i].Pointer;
                            if (chunk.Pointer.NodeIpAddress == null)
                            {
                                chunk.Pointer.NodeIpAddress = address;
                            }
                        }

                        _finalResponse.NextChunk = new List <EnumerationDataChunk>(_chunks.Values);

                        break;

                    case Alachisoft.NCache.Common.Protobuf.Response.Type.EXECUTE_READER:
                        if (_finalResponse == null)
                        {
                            _finalResponse = response;
                        }

                        if ((_finalResponse.ExceptionType == Alachisoft.NCache.Common.Enum.ExceptionType.TYPE_INDEX_NOT_FOUND) ||
                            (_finalResponse.ExceptionType == Alachisoft.NCache.Common.Enum.ExceptionType.ATTRIBUTE_INDEX_NOT_FOUND))
                        {
                            _finalResponse = response;
                            break;
                        }

                        List <ReaderResultSet> protoReaders = response.ProtobufResponse.executeReaderResponse.readerResultSets;

                        if (protoReaders != null && protoReaders.Count > 0)
                        {
                            foreach (ReaderResultSet protoReaderResultSet in protoReaders)
                            {
                                Common.DataReader.ReaderResultSet readerResultSet = null;

                                foreach (Common.DataReader.ReaderResultSet set in _finalResponse.ReaderResultSets)
                                {
                                    if (protoReaderResultSet.readerId == set.ReaderID && protoReaderResultSet.nodeAddress == set.NodeAddress)
                                    {
                                        readerResultSet = set;
                                        break;
                                    }
                                }

                                if (readerResultSet != null)
                                {
                                    PopulateRows((Common.DataReader.RecordSet)readerResultSet.RecordSet, protoReaderResultSet.recordSet.rows);
                                }
                                else
                                {
                                    readerResultSet = ConvertToReaderResult(protoReaderResultSet);
                                    _finalResponse.ReaderResultSets.Add(readerResultSet);
                                }
                            }
                        }

                        break;

                    case Common.Protobuf.Response.Type.GET_READER_CHUNK:

                        if (_finalResponse == null)
                        {
                            _finalResponse = response;
                        }

                        ReaderResultSet protoReaderChunkResultSet = response.ProtobufResponse.getReaderChunkResponse.readerResultSets;
                        Common.DataReader.ReaderResultSet readerChunkResultSet = _finalResponse.ReaderNextChunk;

                        if (readerChunkResultSet != null)
                        {
                            PopulateRows((Common.DataReader.RecordSet)readerChunkResultSet.RecordSet, protoReaderChunkResultSet.recordSet.rows);
                        }
                        else
                        {
                            readerChunkResultSet           = ConvertToReaderResult(protoReaderChunkResultSet);
                            _finalResponse.ReaderNextChunk = readerChunkResultSet;
                        }

                        break;

                    case Alachisoft.NCache.Common.Protobuf.Response.Type.EXCEPTION:
                        if (response.ExceptionType == Common.Enum.ExceptionType.STATE_TRANSFER_EXCEPTION)
                        {
                            _finalResponse = response;
                        }
                        break;

                    default:
                        break;
                    }
                }
            }
        }
Beispiel #13
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;
        }
Beispiel #14
0
        internal void MergeResponse(Common.Net.Address address, CommandResponse response)
        {
            if (_finalResponse == null &&
                (response.Type != Alachisoft.NCache.Common.Protobuf.Response.Type.GET_NEXT_CHUNK &&
                 response.Type != Alachisoft.NCache.Common.Protobuf.Response.Type.GET_READER_CHUNK &&
                 response.Type != Alachisoft.NCache.Common.Protobuf.Response.Type.EXECUTE_READER &&
                 response.Type != Alachisoft.NCache.Common.Protobuf.Response.Type.EXECUTE_READER_CQ))
            {
                _finalResponse = response;

                if (response.IsBrokerReset)
                {
                    MergeFailedResponse(response);
                }
            }
            else
            {
                if (response.IsBrokerReset)
                {
                    MergeFailedResponse(response);
                }
                else
                {
                    IDictionaryEnumerator ide = null;
                    switch (response.Type)
                    {
                    case Common.Protobuf.Response.Type.POLL:
                        _finalResponse.PollingResult.RemovedKeys.AddRange(response.PollingResult.RemovedKeys);
                        _finalResponse.PollingResult.UpdatedKeys.AddRange(response.PollingResult.UpdatedKeys);

                        break;

                    case Common.Protobuf.Response.Type.ADD_BULK:
                    case Common.Protobuf.Response.Type.INSERT_BULK:
                    case Common.Protobuf.Response.Type.GET_BULK:
                    case Common.Protobuf.Response.Type.REMOVE_BULK:
                    case Common.Protobuf.Response.Type.GET_GROUP_DATA:
                    case Common.Protobuf.Response.Type.GET_TAG:
                    case Common.Protobuf.Response.Type.HYBRID_BULK:
                    case Common.Protobuf.Response.Type.INVOKE_ENTRY_PROCESSOR:
                    case Common.Protobuf.Response.Type.MESSAGE_ACKNOWLEDGEMENT:
                        ide = response.KeyValueDic.GetEnumerator();
                        while (ide.MoveNext())
                        {
                            _finalResponse.KeyValueDic[ide.Key] = ide.Value;
                        }

                        ide = response.KeyVersionDic.GetEnumerator();
                        while (ide.MoveNext())
                        {
                            _finalResponse.KeyVersionDic[ide.Key] = ide.Value;
                        }

                        break;

                    case Common.Protobuf.Response.Type.GET_MESSAGE:

                        foreach (var item in response.MessageDic)
                        {
                            if (!_finalResponse.MessageDic.ContainsKey(item.Key))
                            {
                                _finalResponse.MessageDic.Add(item.Key, item.Value);
                            }
                            else
                            {
                                foreach (var message in item.Value)
                                {
                                    _finalResponse.MessageDic[item.Key].Add(message);
                                }
                            }
                        }

                        break;

                    case Common.Protobuf.Response.Type.GET_GROUP_KEYS:
                    case Common.Protobuf.Response.Type.GET_KEYS_TAG:
                        _finalResponse.KeyList.AddRange(response.KeyList);
                        break;

                    case Common.Protobuf.Response.Type.EXECUTE_READER:
                    case Common.Protobuf.Response.Type.EXECUTE_READER_CQ:

                        if (_finalResponse == null)
                        {
                            _finalResponse = response;
                        }

                        if ((_finalResponse.ExceptionType == Common.Enum.ExceptionType.TYPE_INDEX_NOT_FOUND) ||
                            (_finalResponse.ExceptionType ==
                             Common.Enum.ExceptionType.ATTRIBUTE_INDEX_NOT_FOUND))
                        {
                            _finalResponse = response;
                            break;
                        }

                        List <ReaderResultSet> protoReaders =
                            response.Type == Common.Protobuf.Response.Type.EXECUTE_READER
                                    ? response.ProtobufResponse.executeReaderResponse.readerResultSets
                                    : response.ProtobufResponse.executeReaderCQResponse.readerResultSets;

                        if (protoReaders != null && protoReaders.Count > 0)
                        {
                            foreach (ReaderResultSet protoReaderResultSet in protoReaders)
                            {
                                Common.DataReader.ReaderResultSet readerResultSet = null;

                                foreach (Common.DataReader.ReaderResultSet set in _finalResponse.ReaderResultSets)
                                {
                                    if (protoReaderResultSet.readerId == set.ReaderID &&
                                        protoReaderResultSet.nodeAddress == set.NodeAddress)
                                    {
                                        readerResultSet = set;
                                        break;
                                    }
                                }

                                if (readerResultSet != null)
                                {
                                    PopulateRows((Common.DataReader.RecordSet)readerResultSet.RecordSet,
                                                 protoReaderResultSet.recordSet.rows);
                                }
                                else
                                {
                                    readerResultSet = ConvertToReaderResult(protoReaderResultSet);
                                    _finalResponse.ReaderResultSets.Add(readerResultSet);
                                }
                            }
                        }

                        break;

                    case Common.Protobuf.Response.Type.GET_READER_CHUNK:

                        if (_finalResponse == null)
                        {
                            _finalResponse = response;
                        }

                        ReaderResultSet protoReaderChunkResultSet =
                            response.ProtobufResponse.getReaderChunkResponse.readerResultSets;
                        Common.DataReader.ReaderResultSet readerChunkResultSet = _finalResponse.ReaderNextChunk;

                        if (readerChunkResultSet != null)
                        {
                            PopulateRows((Common.DataReader.RecordSet)readerChunkResultSet.RecordSet,
                                         protoReaderChunkResultSet.recordSet.rows);
                        }
                        else
                        {
                            readerChunkResultSet           = ConvertToReaderResult(protoReaderChunkResultSet);
                            _finalResponse.ReaderNextChunk = readerChunkResultSet;
                        }

                        break;

                    case Common.Protobuf.Response.Type.DELETE_QUERY:
                    case Common.Protobuf.Response.Type.REMOVE_QUERY:

                        if ((_finalResponse.ExceptionType == Common.Enum.ExceptionType.TYPE_INDEX_NOT_FOUND) ||
                            (_finalResponse.ExceptionType == Alachisoft.NCache.Common.Enum.ExceptionType
                             .ATTRIBUTE_INDEX_NOT_FOUND))
                        {
                            if ((response.ExceptionType != Common.Enum.ExceptionType.ATTRIBUTE_INDEX_NOT_FOUND) ||
                                (response.ExceptionType != Common.Enum.ExceptionType.TYPE_INDEX_NOT_FOUND))
                            {
                                _finalResponse = response;
                            }
                        }
                        else if (_finalResponse != null &&
                                 (response.ExceptionType != Common.Enum.ExceptionType.ATTRIBUTE_INDEX_NOT_FOUND) ||
                                 (response.ExceptionType != Common.Enum.ExceptionType.TYPE_INDEX_NOT_FOUND))
                        {
                            _finalResponse.RemovedKeyCount += response.RemovedKeyCount;
                        }

                        break;

                    case Common.Protobuf.Response.Type.SEARCH_CQ:
                        _finalResponse.KeyList.AddRange(response.KeyList);
                        if (response.ResultSet != null && !string.IsNullOrEmpty(response.ResultSet.CQUniqueId))
                        {
                            string uniqueID = response.ResultSet.CQUniqueId;
                            if (!string.IsNullOrEmpty(uniqueID) && uniqueID != "-1")
                            {
                                if (_finalResponse.ResultSet != null &&
                                    string.IsNullOrEmpty(_finalResponse.ResultSet.CQUniqueId))
                                {
                                    _finalResponse.ResultSet.CQUniqueId = uniqueID;
                                }
                            }
                        }

                        break;

                    case Common.Protobuf.Response.Type.SEARCH_ENTRIES:

                        if ((_finalResponse.ExceptionType == Common.Enum.ExceptionType.TYPE_INDEX_NOT_FOUND) ||
                            (_finalResponse.ExceptionType ==
                             Common.Enum.ExceptionType.ATTRIBUTE_INDEX_NOT_FOUND))
                        {
                            _finalResponse = response;
                            break;
                        }

                        switch (response.ResultSet.Type)
                        {
                        case NCache.Caching.Queries.QueryType.GroupByAggregateFunction:
                            break;

                        default:
                            switch (response.ResultSet.AggregateFunctionType)
                            {
                            case Alachisoft.NCache.Common.Enum.AggregateFunctionType.NOTAPPLICABLE:
                                ide = response.KeyValueDic.GetEnumerator();
                                while (ide.MoveNext())
                                {
                                    _finalResponse.KeyValueDic[ide.Key] = ide.Value;
                                }

                                break;

                            default:
                                if (!_finalResponse.ResultSet.IsInitialized)
                                {
                                    SetAggregateFunctionResult();
                                    _finalResponse.ResultSet.Initialize(_finalResponse.ResultSet);
                                }

                                _finalResponse.ResultSet.Compile(response.ResultSet);
                                break;
                            }

                            break;
                        }

                        break;


                    case Alachisoft.NCache.Common.Protobuf.Response.Type.SEARCH:

                        if ((_finalResponse.ExceptionType ==
                             Alachisoft.NCache.Common.Enum.ExceptionType.TYPE_INDEX_NOT_FOUND) ||
                            (_finalResponse.ExceptionType == Alachisoft.NCache.Common.Enum.ExceptionType
                             .ATTRIBUTE_INDEX_NOT_FOUND))
                        {
                            _finalResponse = response;
                            break;
                        }

                        switch (response.ResultSet.AggregateFunctionType)
                        {
                        case Alachisoft.NCache.Common.Enum.AggregateFunctionType.NOTAPPLICABLE:
                            _finalResponse.KeyList.AddRange(response.KeyList);
                            break;

                        default:
                            if (!_finalResponse.ResultSet.IsInitialized)
                            {
                                SetAggregateFunctionResult();
                                _finalResponse.ResultSet.Initialize(_finalResponse.ResultSet);
                            }

                            _finalResponse.ResultSet.Compile(response.ResultSet);
                            break;
                        }

                        break;

                    case Alachisoft.NCache.Common.Protobuf.Response.Type.GET_SERVER_MAPPING:
                        _finalResponse.ServerMappingList = response.ServerMappingList;
                        break;

                    case Alachisoft.NCache.Common.Protobuf.Response.Type.SEARCH_ENTRIES_CQ:
                        ide = response.KeyValueDic.GetEnumerator();
                        while (ide.MoveNext())
                        {
                            _finalResponse.KeyValueDic[ide.Key] = ide.Value;
                        }

                        if (response.ResultSet != null && response.ResultSet.CQUniqueId != null)
                        {
                            string uniqueID = response.ResultSet.CQUniqueId;
                            if (!string.IsNullOrEmpty(uniqueID) && uniqueID != null)
                            {
                                if (_finalResponse.ResultSet != null &&
                                    string.IsNullOrEmpty(_finalResponse.ResultSet.CQUniqueId))
                                {
                                    _finalResponse.ResultSet.CQUniqueId = response.ResultSet.CQUniqueId;
                                }
                            }
                        }

                        break;

                    case Alachisoft.NCache.Common.Protobuf.Response.Type.GET_NEXT_CHUNK:
                        if (_finalResponse == null)
                        {
                            _finalResponse = response;
                        }

                        EnumerationDataChunk chunk = null;
                        if (_chunks.ContainsKey(address))
                        {
                            chunk = _chunks[address];
                        }
                        else
                        {
                            chunk      = new EnumerationDataChunk();
                            chunk.Data = new List <string>();
                            _chunks.Add(address, chunk);
                        }

                        for (int i = 0; i < response.NextChunk.Count; i++)
                        {
                            chunk.Data.AddRange(response.NextChunk[i].Data);
                            chunk.Pointer = response.NextChunk[i].Pointer;
                            if (chunk.Pointer.NodeIpAddress == null)
                            {
                                chunk.Pointer.NodeIpAddress = address;
                            }
                        }

                        _finalResponse.NextChunk = new List <EnumerationDataChunk>(_chunks.Values);

                        break;

                    case Common.Protobuf.Response.Type.TASK_ENUMERATOR:
                        _finalResponse.TaskEnumerator.AddRange(response.TaskEnumerator);
                        break;

                    case Alachisoft.NCache.Common.Protobuf.Response.Type.EXCEPTION:
                        if (response.ExceptionType == Common.Enum.ExceptionType.STATE_TRANSFER_EXCEPTION)
                        {
                            _finalResponse = response;
                        }

                        break;

                    default:
                        break;
                    }
                }
            }
        }