public List <IPrimaryRelayMessageQuery> SplitQuery(
     int numClustersInGroup,
     int localClusterPosition,
     out IPrimaryRelayMessageQuery localQuery)
 {
     throw new NotImplementedException();
 }
Beispiel #2
0
        public override List <IPrimaryRelayMessageQuery> SplitQuery(int numClustersInGroup,
                                                                    int localClusterPosition,
                                                                    out IPrimaryRelayMessageQuery localQuery)
        {
            this.numClustersInGroup = numClustersInGroup;

            return(base.SplitQuery(numClustersInGroup, localClusterPosition, out localQuery));
        }
Beispiel #3
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);
        }
        public List <IPrimaryRelayMessageQuery> SplitQuery(
            int numClustersInGroup,
            int localClusterPosition,
            out IPrimaryRelayMessageQuery localQuery)
        {
            IntersectionQuery intersectionQuery;
            List <IPrimaryRelayMessageQuery> queryList = new List <IPrimaryRelayMessageQuery>();
            Dictionary <int, Triple <List <byte[]>, List <int>, Dictionary <byte[], IntersectionQueryParams> > > clusterParamsMapping;

            localQuery = null;

            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
                };

                if (clusterParam.Key == localClusterPosition)
                {
                    localQuery = intersectionQuery;
                }
                else
                {
                    queryList.Add(intersectionQuery);
                }
            }
            return(queryList);
        }