コード例 #1
0
        public List <IPrimaryRelayMessageQuery> SplitQuery(int numClustersInGroup)
        {
            IntersectionQuery intersectionQuery;
            List <IPrimaryRelayMessageQuery> queryList = new List <IPrimaryRelayMessageQuery>();
            Dictionary <int, Triple <List <byte[]>, List <int>, Dictionary <byte[], IntersectionQueryParams> > > clusterParamsMapping;

            IndexCacheUtils.SplitIndexIdsByCluster(IndexIdList, PrimaryIdList, intersectionQueryParamsMapping, numClustersInGroup, out clusterParamsMapping);

            if (clusterParamsMapping.Count == 1)
            {
                //This means that the query is not spilt across more than multiple clusters and the MaxResultItems criteria can be applied on the server
                IsSingleClusterQuery = true;
            }

            foreach (KeyValuePair <int, Triple <List <byte[]>, List <int>, Dictionary <byte[], IntersectionQueryParams> > > clusterParam in clusterParamsMapping)
            {
                intersectionQuery = new IntersectionQuery(this)
                {
                    primaryId     = clusterParam.Key,
                    IndexIdList   = clusterParam.Value.First,
                    PrimaryIdList = clusterParam.Value.Second,
                    intersectionQueryParamsMapping = clusterParam.Value.Third
                };
                queryList.Add(intersectionQuery);
            }
            return(queryList);
        }
コード例 #2
0
        public virtual List <IPrimaryRelayMessageQuery> SplitQuery(int numClustersInGroup,
                                                                   int localClusterPosition,
                                                                   out IPrimaryRelayMessageQuery localQuery)
        {
            BaseMultiIndexIdQuery <TQueryResult> query;

            List <IPrimaryRelayMessageQuery> queryList = new List <IPrimaryRelayMessageQuery>();
            Dictionary <int /*cluster number*/, Triple <List <byte[]>, List <int>, Dictionary <byte[], IndexIdParams> > > clusterParamsMapping;

            localQuery = null;

            IndexCacheUtils.SplitIndexIdsByCluster(
                IndexIdList,
                PrimaryIdList,
                IndexIdParamsMapping,
                numClustersInGroup,
                out clusterParamsMapping);

            int mappingClusterCount = clusterParamsMapping.Count;
            int queryCount          = 0;

            ClientSideSubsetProcessingRequired =
                (numClustersInGroup > 1 && IndexIdList.Count > 1 && mappingClusterCount > 1);

            Triple <List <byte[]> /*index id list*/, List <int> /*primary id list*/, Dictionary <byte[], IndexIdParams> /*index id parms*/> value;

            for (int i = 0; i < numClustersInGroup; i++)
            {
                if (clusterParamsMapping.TryGetValue(i, out value) == false)
                {
                    continue;
                }

                query = (BaseMultiIndexIdQuery <TQueryResult>)Clone();

                query.PrimaryId            = i;
                query.IndexIdList          = value.First;
                query.PrimaryIdList        = value.Second;
                query.IndexIdParamsMapping = value.Third;
                query.ExcludeData          = true;      // dont retrieve data in these split queries for now

                if (query.PrimaryId == localClusterPosition)
                {
                    localQuery = query;
                }
                else
                {
                    queryList.Add(query);
                }

                if (++queryCount == mappingClusterCount)
                {
                    break;
                }
            }

            return(queryList);
        }
コード例 #3
0
        public List <IPrimaryRelayMessageQuery> SplitQuery(int numClustersInGroup)
        {
            IntersectionQuery intersectionQuery;
            List <IPrimaryRelayMessageQuery> queryList = new List <IPrimaryRelayMessageQuery>();
            Dictionary <int, Triple <List <byte[]>, List <int>, Dictionary <byte[], IntersectionQueryParams> > > clusterParamsMapping;

            IndexCacheUtils.SplitIndexIdsByCluster(indexIdList, primaryIdList, intersectionQueryParamsMapping, numClustersInGroup, out clusterParamsMapping);

            foreach (KeyValuePair <int, Triple <List <byte[]>, List <int>, Dictionary <byte[], IntersectionQueryParams> > > clusterParam in clusterParamsMapping)
            {
                intersectionQuery = new IntersectionQuery(this)
                {
                    primaryId     = clusterParam.Key,
                    indexIdList   = clusterParam.Value.First,
                    primaryIdList = clusterParam.Value.Second,
                    intersectionQueryParamsMapping = clusterParam.Value.Third
                };
                queryList.Add(intersectionQuery);
            }
            return(queryList);
        }
コード例 #4
0
        public List <IPrimaryRelayMessageQuery> SplitQuery(int numClustersInGroup)
        {
            BaseMultiIndexContainsQuery <TQueryResult> multiIndexContainsQuery;
            List <IPrimaryRelayMessageQuery>           queryList = new List <IPrimaryRelayMessageQuery>();
            Dictionary <int, Triple <List <byte[]>, List <int>, Dictionary <byte[], MultiIndexContainsQueryParams> > > clusterParamsMapping;

            IndexCacheUtils.SplitIndexIdsByCluster(IndexIdList, PrimaryIdList, MultiIndexContainsQueryParamsMapping, numClustersInGroup, out clusterParamsMapping);

            foreach (KeyValuePair <int, Triple <List <byte[]>, List <int>, Dictionary <byte[], MultiIndexContainsQueryParams> > > clusterParam in clusterParamsMapping)
            {
                multiIndexContainsQuery = new BaseMultiIndexContainsQuery <TQueryResult>(this)
                {
                    PrimaryId     = clusterParam.Key,
                    IndexIdList   = clusterParam.Value.First,
                    PrimaryIdList = clusterParam.Value.Second,
                    MultiIndexContainsQueryParamsMapping = clusterParam.Value.Third
                };
                queryList.Add(multiIndexContainsQuery);
            }
            return(queryList);
        }
コード例 #5
0
        public virtual List <IPrimaryRelayMessageQuery> SplitQuery(int numClustersInGroup)
        {
            BaseMultiIndexIdQuery <TQueryResult> query;

            List <IPrimaryRelayMessageQuery> queryList = new List <IPrimaryRelayMessageQuery>();
            Dictionary <int /*cluster number*/, Triple <List <byte[]>, List <int>, Dictionary <byte[], IndexIdParams> > > clusterParamsMapping;

            IndexCacheUtils.SplitIndexIdsByCluster(IndexIdList,
                                                   PrimaryIdList,
                                                   IndexIdParamsMapping,
                                                   numClustersInGroup,
                                                   out clusterParamsMapping);

            int mappingClusterCount = clusterParamsMapping.Count;

            ClientSideSubsetProcessingRequired =
                (numClustersInGroup > 1 && IndexIdList.Count > 1 && mappingClusterCount > 1);

            Triple <List <byte[]> /*index id list*/, List <int> /*Primary id list*/, Dictionary <byte[], IndexIdParams> /*IndexId Params Mapping*/> value;

            for (int i = 0; i < numClustersInGroup && queryList.Count < mappingClusterCount; i++)
            {
                if (clusterParamsMapping.TryGetValue(i, out value) == false)
                {
                    continue;
                }

                query = (BaseMultiIndexIdQuery <TQueryResult>)Clone();

                query.PrimaryId            = i;
                query.IndexIdList          = value.First;
                query.PrimaryIdList        = value.Second;
                query.IndexIdParamsMapping = value.Third;

                queryList.Add(query);
            }

            return(queryList);
        }
コード例 #6
0
        public override List <IPrimaryRelayMessageQuery> SplitQuery(int numClustersInGroup)
        {
            SpanQuery query;
            List <IPrimaryRelayMessageQuery> queryList = new List <IPrimaryRelayMessageQuery>();
            Dictionary <int, Triple <List <byte[]>, List <int>, Dictionary <byte[], IndexIdParams> > > clusterParamsMapping;

            IndexCacheUtils.SplitIndexIdsByCluster(IndexIdList, PrimaryIdList, IndexIdParamsMapping, numClustersInGroup, out clusterParamsMapping);

            ClientSideSubsetProcessingRequired = (numClustersInGroup > 1 && IndexIdList.Count > 1 && clusterParamsMapping.Count > 1);

            foreach (KeyValuePair <int, Triple <List <byte[]>, List <int>, Dictionary <byte[], IndexIdParams> > > clusterParam in clusterParamsMapping)
            {
                query = new SpanQuery(this)
                {
                    PrimaryId            = clusterParam.Key,
                    IndexIdList          = clusterParam.Value.First,
                    PrimaryIdList        = clusterParam.Value.Second,
                    IndexIdParamsMapping = clusterParam.Value.Third,
                };
                queryList.Add(query);
            }
            return(queryList);
        }