@@ -782,14 +782,29 @@ private void routeChunkData() throws LoadFileException {
782782 return ;
783783 }
784784
785+ final List <Pair <IDeviceID , TTimePartitionSlot >> partitionSlotList = new ArrayList <>();
786+ final int [] chunkPartitionIndexes = new int [nonDirectionalChunkData .size ()];
787+ final Map <IDeviceID , Map <TTimePartitionSlot , Integer >> partitionSlotIndexes = new HashMap <>();
788+ for (int i = 0 , size = nonDirectionalChunkData .size (); i < size ; i ++) {
789+ final ChunkData chunkData = nonDirectionalChunkData .get (i );
790+ final IDeviceID device = chunkData .getDevice ();
791+ final TTimePartitionSlot timePartitionSlot = chunkData .getTimePartitionSlot ();
792+ final Map <TTimePartitionSlot , Integer > slotIndexes =
793+ partitionSlotIndexes .computeIfAbsent (device , key -> new HashMap <>());
794+ Integer partitionSlotIndex = slotIndexes .get (timePartitionSlot );
795+ if (partitionSlotIndex == null ) {
796+ partitionSlotIndex = partitionSlotList .size ();
797+ slotIndexes .put (timePartitionSlot , partitionSlotIndex );
798+ partitionSlotList .add (new Pair <>(device , timePartitionSlot ));
799+ }
800+ chunkPartitionIndexes [i ] = partitionSlotIndex ;
801+ }
802+
785803 List <TRegionReplicaSet > replicaSets =
786804 scheduler .partitionFetcher .queryDataPartition (
787- nonDirectionalChunkData .stream ()
788- .map (data -> new Pair <>(data .getDevice (), data .getTimePartitionSlot ()))
789- .collect (Collectors .toList ()),
790- scheduler .queryContext .getSession ().getUserName ());
791- for (int i = 0 ; i < replicaSets .size (); i ++) {
792- final TRegionReplicaSet replicaSet = replicaSets .get (i );
805+ partitionSlotList , scheduler .queryContext .getSession ().getUserName ());
806+ for (int i = 0 , size = nonDirectionalChunkData .size (); i < size ; i ++) {
807+ final TRegionReplicaSet replicaSet = replicaSets .get (chunkPartitionIndexes [i ]);
793808 final TConsensusGroupId regionId = replicaSet .getRegionId ();
794809 if (regionId2ReplicaSetAndNode .containsKey (regionId )
795810 && !Objects .equals (regionId2ReplicaSetAndNode .get (regionId ).getLeft (), replicaSet )) {
@@ -864,50 +879,49 @@ public void setDatabase(String database) {
864879
865880 public List <TRegionReplicaSet > queryDataPartition (
866881 List <Pair <IDeviceID , TTimePartitionSlot >> slotList , String userName ) {
867- List <TRegionReplicaSet > replicaSets = new ArrayList <>();
882+ List <TRegionReplicaSet > replicaSets = new ArrayList <>(slotList . size () );
868883 int size = slotList .size ();
869884
870885 for (int i = 0 ; i < size ; i += TRANSMIT_LIMIT ) {
871886 List <Pair <IDeviceID , TTimePartitionSlot >> subSlotList =
872887 slotList .subList (i , Math .min (size , i + TRANSMIT_LIMIT ));
873888 DataPartition dataPartition =
874889 fetcher .getOrCreateDataPartition (toQueryParam (subSlotList ), userName );
875- replicaSets .addAll (
876- subSlotList .stream ()
877- .map (
878- pair ->
879- // database is an explicit database hint for table-model loads and
880- // pipe-generated tree-model loads.
881- database != null
882- ? dataPartition .getDataRegionReplicaSetForWriting (
883- pair .left , pair .right , database )
884- : dataPartition .getDataRegionReplicaSetForWriting (
885- pair .left , pair .right ))
886- .collect (Collectors .toList ()));
890+ for (final Pair <IDeviceID , TTimePartitionSlot > pair : subSlotList ) {
891+ // database is an explicit database hint for table-model loads and
892+ // pipe-generated tree-model loads.
893+ replicaSets .add (
894+ database != null
895+ ? dataPartition .getDataRegionReplicaSetForWriting (pair .left , pair .right , database )
896+ : dataPartition .getDataRegionReplicaSetForWriting (pair .left , pair .right ));
897+ }
887898 }
888899 return replicaSets ;
889900 }
890901
891902 private List <DataPartitionQueryParam > toQueryParam (
892903 List <Pair <IDeviceID , TTimePartitionSlot >> slots ) {
893- return slots .stream ()
894- .collect (
895- Collectors .groupingBy (
896- Pair ::getLeft , Collectors .mapping (Pair ::getRight , Collectors .toSet ())))
897- .entrySet ()
898- .stream ()
899- .map (
900- entry -> {
901- DataPartitionQueryParam queryParam =
902- new DataPartitionQueryParam (entry .getKey (), new ArrayList <>(entry .getValue ()));
903- // database is an explicit database hint for table-model loads and
904- // pipe-generated tree-model loads.
905- if (database != null ) {
906- queryParam .setDatabaseName (database );
907- }
908- return queryParam ;
909- })
910- .collect (Collectors .toList ());
904+ final Map <IDeviceID , Set <TTimePartitionSlot >> device2TimePartitionSlots = new HashMap <>();
905+ for (final Pair <IDeviceID , TTimePartitionSlot > slot : slots ) {
906+ device2TimePartitionSlots
907+ .computeIfAbsent (slot .left , key -> new HashSet <>())
908+ .add (slot .right );
909+ }
910+
911+ final List <DataPartitionQueryParam > queryParams =
912+ new ArrayList <>(device2TimePartitionSlots .size ());
913+ for (final Map .Entry <IDeviceID , Set <TTimePartitionSlot >> entry :
914+ device2TimePartitionSlots .entrySet ()) {
915+ final DataPartitionQueryParam queryParam =
916+ new DataPartitionQueryParam (entry .getKey (), new ArrayList <>(entry .getValue ()));
917+ // database is an explicit database hint for table-model loads and
918+ // pipe-generated tree-model loads.
919+ if (database != null ) {
920+ queryParam .setDatabaseName (database );
921+ }
922+ queryParams .add (queryParam );
923+ }
924+ return queryParams ;
911925 }
912926 }
913927}
0 commit comments