public override void _GetNodesInfo_implHandler(GetNodesInfoRequestReader request, GetNodesInfoResponseWriter response)
        {
            List <string> fields        = request.fields;
            int           field_cnt     = fields.Count;
            List <long>   secondary_ids = request.Contains_secondary_ids ? request.secondary_ids : null;

            NodeInfo[] infos = new NodeInfo[request.ids.Count];

            Parallel.ForEach(request.ids, (id, state, idx) =>
            {
                try
                {
                    using (var cell = s_useICellFunc(id))
                    {
                        infos[idx] = new NodeInfo
                        {
                            id     = id,
                            values = fields.Select(f =>
                            {
                                switch (f)
                                {
                                case JsonDSL.graph_outlinks:
                                    return(ToJsonArray(_GetEdgeType(cell, secondary_ids[(int)idx])));

                                case "*":
                                    return(cell.ToString());

                                default:
                                    return(cell.get(f));
                                }
                            }).ToList(),
                        };
                    }
                }
                catch // use cell failed. populate the list with an empty NodeInfo.
                {
                    infos[idx] = _CreateEmptyNodeInfo(id, field_cnt);
                }
            });
            response.infoList = infos.ToList();
        }
Exemple #2
0
        public override void _GetNodesInfo_implHandler(GetNodesInfoRequestReader request, GetNodesInfoResponseWriter response)
        {
            List <string>      fields        = request.fields;
            IEnumerable <long> secondary_ids = request.Contains_secondary_ids ? request.secondary_ids : Enumerable.Repeat(0L, request.ids.Count);

            try
            {
                long msg_approx_len = 0;
                foreach ((long a, long b) in request.ids.Zip(secondary_ids, (a, b) => (a, b)))
                {
                    NodeInfo info = _GetNodeInfo(a, fields, b);
                    msg_approx_len += info.values.Sum(_ => _.Length);
                    if (msg_approx_len > FanoutSearchModule.s_max_rsp_size)
                    {
                        throw new MessageTooLongException($"{nameof(_GetNodesInfo_implHandler)}: Message too long");
                    }
                    response.infoList.Add(info);
                }
            }
            catch (AccessorResizeException ex)
            {
                throw new MessageTooLongException($"{nameof(_GetNodesInfo_implHandler)}: Message too long", ex);
            }
        }
        public override void _GetNodesInfo_implHandler(GetNodesInfoRequestReader request, GetNodesInfoResponseWriter response)
        {
            List <string> fields        = request.fields;
            int           field_cnt     = fields.Count;
            List <long>   ids           = request.ids;
            List <long>   secondary_ids = request.Contains_secondary_ids ? request.secondary_ids : null;

            for (int idx = 0, len = ids.Count; idx != len; ++idx)
            {
                long id = ids[idx];
                try
                {
                    using (var cell = s_useICellFunc(id))
                    {
                        response.infoList.Add(new NodeInfo
                        {
                            id     = id,
                            values = fields.Select(f =>
                            {
                                switch (f)
                                {
                                case JsonDSL.graph_outlink_type:
                                    return(ToJsonArray(_GetEdgeType(cell, secondary_ids[idx])));

                                case "*":
                                    return(cell.ToString());

                                default:
                                    return(cell.get(f));
                                }
                            }).ToList(),
                        });
                    }
                }
                catch // use cell failed. populate the list with an empty NodeInfo.
                {
                    response.infoList.Add(_CreateEmptyNodeInfo(id, field_cnt));
                }
            }
        }
        public override void _GetNodesInfo_implHandler(GetNodesInfoRequestReader request, GetNodesInfoResponseWriter response)
        {
            List <string> fields        = request.fields;
            int           field_cnt     = fields.Count;
            List <long>   secondary_ids = request.Contains_secondary_ids ? request.secondary_ids : null;

            NodeInfo[] infos          = new NodeInfo[request.ids.Count];
            bool       msg_overflow   = false;
            long       msg_approx_len = 0;

            Parallel.ForEach(request.ids, (id, state, idx) =>
            {
                try
                {
                    using (var cell = s_useICellFunc(id))
                    {
                        infos[idx] = new NodeInfo
                        {
                            id     = id,
                            values = fields.Select(f =>
                            {
                                switch (f)
                                {
                                case JsonDSL.graph_outlinks:
                                    return(ToJsonArray(_GetEdgeType(cell, secondary_ids[(int)idx])));

                                case "*":
                                    return(cell.ToString());

                                default:
                                    return(cell.get(f));
                                }
                            }).ToList(),
                        };
                    }

                    if (Interlocked.Add(ref msg_approx_len, infos[idx].values.Sum(_ => _.Length)) > FanoutSearchModule.s_max_rsp_size)
                    {
                        msg_overflow = true;
                        state.Break();
                    }
                }
                catch // use cell failed. populate the list with an empty NodeInfo.
                {
                    infos[idx] = _CreateEmptyNodeInfo(id, field_cnt);
                }
            });

            if (msg_overflow)
            {
                throw new MessageTooLongException();
            }

            try
            {
                response.infoList = infos.ToList();
            }
            catch (AccessorResizeException ex)
            {
                throw new MessageTooLongException($"{nameof(_GetNodesInfo_implHandler)}: Message too long", ex);
            }
        }