@@ -709,18 +709,29 @@ private void routeChunkData() throws LoadFileException {
709709 return ;
710710 }
711711
712+ final List <Pair <IDeviceID , TTimePartitionSlot >> partitionSlotList = new ArrayList <>();
713+ final int [] chunkPartitionIndexes = new int [nonDirectionalChunkData .size ()];
714+ final Map <IDeviceID , Map <TTimePartitionSlot , Integer >> partitionSlotIndexes = new HashMap <>();
715+ for (int i = 0 , size = nonDirectionalChunkData .size (); i < size ; i ++) {
716+ final ChunkData chunkData = nonDirectionalChunkData .get (i );
717+ final IDeviceID device = new PlainDeviceID (chunkData .getDevice ());
718+ final TTimePartitionSlot timePartitionSlot = chunkData .getTimePartitionSlot ();
719+ final Map <TTimePartitionSlot , Integer > slotIndexes =
720+ partitionSlotIndexes .computeIfAbsent (device , key -> new HashMap <>());
721+ Integer partitionSlotIndex = slotIndexes .get (timePartitionSlot );
722+ if (partitionSlotIndex == null ) {
723+ partitionSlotIndex = partitionSlotList .size ();
724+ slotIndexes .put (timePartitionSlot , partitionSlotIndex );
725+ partitionSlotList .add (new Pair <>(device , timePartitionSlot ));
726+ }
727+ chunkPartitionIndexes [i ] = partitionSlotIndex ;
728+ }
729+
712730 List <TRegionReplicaSet > replicaSets =
713731 scheduler .partitionFetcher .queryDataPartition (
714- nonDirectionalChunkData .stream ()
715- .map (
716- data ->
717- new Pair <>(
718- (IDeviceID ) new PlainDeviceID (data .getDevice ()),
719- data .getTimePartitionSlot ()))
720- .collect (Collectors .toList ()),
721- scheduler .queryContext .getSession ().getUserName ());
722- for (int i = 0 ; i < replicaSets .size (); i ++) {
723- final TRegionReplicaSet replicaSet = replicaSets .get (i );
732+ partitionSlotList , scheduler .queryContext .getSession ().getUserName ());
733+ for (int i = 0 , size = nonDirectionalChunkData .size (); i < size ; i ++) {
734+ final TRegionReplicaSet replicaSet = replicaSets .get (chunkPartitionIndexes [i ]);
724735 final TConsensusGroupId regionId = replicaSet .getRegionId ();
725736 if (regionId2ReplicaSetAndNode .containsKey (regionId )
726737 && !Objects .equals (regionId2ReplicaSetAndNode .get (regionId ).getLeft (), replicaSet )) {
@@ -790,39 +801,42 @@ public DataPartitionBatchFetcher(IPartitionFetcher fetcher) {
790801
791802 public List <TRegionReplicaSet > queryDataPartition (
792803 List <Pair <IDeviceID , TTimePartitionSlot >> slotList , String userName ) {
793- List <TRegionReplicaSet > replicaSets = new ArrayList <>();
804+ List <TRegionReplicaSet > replicaSets = new ArrayList <>(slotList . size () );
794805 int size = slotList .size ();
795806
796807 for (int i = 0 ; i < size ; i += TRANSMIT_LIMIT ) {
797808 List <Pair <IDeviceID , TTimePartitionSlot >> subSlotList =
798809 slotList .subList (i , Math .min (size , i + TRANSMIT_LIMIT ));
799810 DataPartition dataPartition =
800811 fetcher .getOrCreateDataPartition (toQueryParam (subSlotList ), userName );
801- replicaSets .addAll (
802- subSlotList .stream ()
803- .map (
804- pair ->
805- dataPartition .getDataRegionReplicaSetForWriting (
806- ((PlainDeviceID ) pair .left ).toStringID (), pair .right ))
807- .collect (Collectors .toList ()));
812+ for (final Pair <IDeviceID , TTimePartitionSlot > pair : subSlotList ) {
813+ replicaSets .add (
814+ dataPartition .getDataRegionReplicaSetForWriting (
815+ ((PlainDeviceID ) pair .left ).toStringID (), pair .right ));
816+ }
808817 }
809818 return replicaSets ;
810819 }
811820
812821 private List <DataPartitionQueryParam > toQueryParam (
813822 List <Pair <IDeviceID , TTimePartitionSlot >> slots ) {
814- return slots .stream ()
815- .collect (
816- Collectors .groupingBy (
817- Pair ::getLeft , Collectors .mapping (Pair ::getRight , Collectors .toSet ())))
818- .entrySet ()
819- .stream ()
820- .map (
821- entry ->
822- new DataPartitionQueryParam (
823- ((PlainDeviceID ) entry .getKey ()).toStringID (),
824- new ArrayList <>(entry .getValue ())))
825- .collect (Collectors .toList ());
823+ final Map <IDeviceID , Set <TTimePartitionSlot >> device2TimePartitionSlots = new HashMap <>();
824+ for (final Pair <IDeviceID , TTimePartitionSlot > slot : slots ) {
825+ device2TimePartitionSlots
826+ .computeIfAbsent (slot .left , key -> new HashSet <>())
827+ .add (slot .right );
828+ }
829+
830+ final List <DataPartitionQueryParam > queryParams =
831+ new ArrayList <>(device2TimePartitionSlots .size ());
832+ for (final Map .Entry <IDeviceID , Set <TTimePartitionSlot >> entry :
833+ device2TimePartitionSlots .entrySet ()) {
834+ final DataPartitionQueryParam queryParam =
835+ new DataPartitionQueryParam (
836+ ((PlainDeviceID ) entry .getKey ()).toStringID (), new ArrayList <>(entry .getValue ()));
837+ queryParams .add (queryParam );
838+ }
839+ return queryParams ;
826840 }
827841 }
828842}
0 commit comments