@@ -653,6 +653,109 @@ public <T> List<BatchResponse> chunkedBatch(
653653  return chunkedBatch(indexName, objects, action, waitForTasks, 1000, requestOptions); 
654654} 
655655
656+ /** 
657+  * Helper: Similar to the `saveObjects` method but requires a Push connector 
658+  * (https://www.algolia.com/doc/guides/sending-and-managing-data/send-and-update-your-data/connectors/push/) 
659+  * to be created first, in order to transform records before indexing them to Algolia. The 
660+  * `region` must have been passed to the client instantiation method. 
661+  * 
662+  * @param indexName The `indexName` to replace `objects` in. 
663+  * @param objects The array of `objects` to store in the given Algolia `indexName`. 
664+  * @throws AlgoliaRetryException When the retry has failed on all hosts 
665+  * @throws AlgoliaApiException When the API sends an http error code 
666+  * @throws AlgoliaRuntimeException When an error occurred during the serialization 
667+  */ 
668+ public <T> WatchResponse saveObjectsWithTransformation(String indexName, Iterable<T> objects) { 
669+   return saveObjectsWithTransformation(indexName, objects, null); 
670+ } 
671+ 
672+ /** 
673+  * Helper: Similar to the `saveObjects` method but requires a Push connector 
674+  * (https://www.algolia.com/doc/guides/sending-and-managing-data/send-and-update-your-data/connectors/push/) 
675+  * to be created first, in order to transform records before indexing them to Algolia. The 
676+  * `region` must have been passed to the client instantiation method. 
677+  * 
678+  * @param indexName The `indexName` to replace `objects` in. 
679+  * @param objects The array of `objects` to store in the given Algolia `indexName`. 
680+  * @param requestOptions The requestOptions to send along with the query, they will be merged with 
681+  *     the transporter requestOptions. (optional) 
682+  */ 
683+ public <T> WatchResponse saveObjectsWithTransformation(String indexName, Iterable<T> objects, RequestOptions requestOptions) { 
684+   return saveObjectsWithTransformation(indexName, objects, false, requestOptions); 
685+ } 
686+ 
687+ /** 
688+  * Helper: Similar to the `saveObjects` method but requires a Push connector 
689+  * (https://www.algolia.com/doc/guides/sending-and-managing-data/send-and-update-your-data/connectors/push/) 
690+  * to be created first, in order to transform records before indexing them to Algolia. The 
691+  * `region` must have been passed to the client instantiation method. 
692+  * 
693+  * @param indexName The `indexName` to replace `objects` in. 
694+  * @param objects The array of `objects` to store in the given Algolia `indexName`. 
695+  * @param waitForTasks - Whether or not we should wait until every `batch` tasks has been 
696+  *     processed, this operation may slow the total execution time of this method but is more 
697+  *     reliable. 
698+  * @param requestOptions The requestOptions to send along with the query, they will be merged with 
699+  *     the transporter requestOptions. (optional) 
700+  */ 
701+ public <T> WatchResponse saveObjectsWithTransformation( 
702+   String indexName, 
703+   Iterable<T> objects, 
704+   boolean waitForTasks, 
705+   RequestOptions requestOptions 
706+ ) { 
707+   return saveObjectsWithTransformation(indexName, objects, waitForTasks, 1000, requestOptions); 
708+ } 
709+ 
710+ /** 
711+  * Helper: Similar to the `saveObjects` method but requires a Push connector 
712+  * (https://www.algolia.com/doc/guides/sending-and-managing-data/send-and-update-your-data/connectors/push/) 
713+  * to be created first, in order to transform records before indexing them to Algolia. The 
714+  * `region` must have been passed to the client instantiation method. 
715+  * 
716+  * @param indexName The `indexName` to replace `objects` in. 
717+  * @param objects The array of `objects` to store in the given Algolia `indexName`. 
718+  * @param waitForTasks - Whether or not we should wait until every `batch` tasks has been 
719+  *     processed, this operation may slow the total execution time of this method but is more 
720+  *     reliable. 
721+  * @param batchSize The size of the chunk of `objects`. The number of `batch` calls will be equal 
722+  *     to `length(objects) / batchSize`. 
723+  * @param requestOptions The requestOptions to send along with the query, they will be merged with 
724+  *     the transporter requestOptions. (optional) 
725+  */ 
726+ public <T> WatchResponse saveObjectsWithTransformation( 
727+   String indexName, 
728+   Iterable<T> objects, 
729+   boolean waitForTasks, 
730+   int batchSize, 
731+   RequestOptions requestOptions 
732+ ) { 
733+   if (this.ingestionTransporter == null) { 
734+     throw new AlgoliaRuntimeException("`setTransformationRegion` must have been called before calling this method."); 
735+   } 
736+ 
737+   return this.ingestionTransporter.push( 
738+       indexName, 
739+       new PushTaskPayload().setAction(com.algolia.model.ingestion.Action.ADD_OBJECT).setRecords(this.objectsToPushTaskRecords(objects)), 
740+       waitForTasks, 
741+       requestOptions 
742+     ); 
743+ } 
744+ 
745+ private <T> List<PushTaskRecords> objectsToPushTaskRecords(Iterable<T> iterable) { 
746+   List<PushTaskRecords> payload = new ArrayList<>(); 
747+   for (T item : iterable) { 
748+     if (item instanceof PushTaskRecords) { 
749+       payload.add((PushTaskRecords) item); 
750+     } else { 
751+       throw new AlgoliaRuntimeException( 
752+         "each object must have an `objectID` key in order to be used with the" + " WithTransformation methods" 
753+       ); 
754+     } 
755+   } 
756+   return payload; 
757+ } 
758+ 
656759/** 
657760 * Helper: Saves the given array of objects in the given index. The `chunkedBatch` helper is used 
658761 * under the hood, which creates a `batch` requests with at most 1000 objects in it. 
@@ -777,6 +880,114 @@ public List<BatchResponse> deleteObjects(String indexName, List<String> objectID
777880  return chunkedBatch(indexName, objects, Action.DELETE_OBJECT, waitForTasks, batchSize, requestOptions); 
778881} 
779882
883+ /** 
884+  * Helper: Similar to the `partialUpdateObjects` method but requires a Push connector 
885+  * (https://www.algolia.com/doc/guides/sending-and-managing-data/send-and-update-your-data/connectors/push/) 
886+  * to be created first, in order to transform records before indexing them to Algolia. The 
887+  * `region` must have been passed to the client instantiation method. 
888+  * 
889+  * @param indexName The `indexName` to update `objects` in. 
890+  * @param objects The array of `objects` to update in the given Algolia `indexName`. 
891+  * @param createIfNotExists To be provided if non-existing objects are passed, otherwise, the call 
892+  *     will fail. 
893+  */ 
894+ public <T> WatchResponse partialUpdateObjectsWithTransformation(String indexName, Iterable<T> objects, boolean createIfNotExists) { 
895+   return partialUpdateObjectsWithTransformation(indexName, objects, createIfNotExists, false, null); 
896+ } 
897+ 
898+ /** 
899+  * Helper: Similar to the `partialUpdateObjects` method but requires a Push connector 
900+  * (https://www.algolia.com/doc/guides/sending-and-managing-data/send-and-update-your-data/connectors/push/) 
901+  * to be created first, in order to transform records before indexing them to Algolia. The 
902+  * `region` must have been passed to the client instantiation method. 
903+  * 
904+  * @param indexName The `indexName` to update `objects` in. 
905+  * @param objects The array of `objects` to update in the given Algolia `indexName`. 
906+  * @param createIfNotExists To be provided if non-existing objects are passed, otherwise, the call 
907+  *     will fail. 
908+  * @param waitForTasks - Whether or not we should wait until every `batch` tasks has been 
909+  *     processed, this operation may slow the total execution time of this method but is more 
910+  *     reliable. 
911+  */ 
912+ public <T> WatchResponse partialUpdateObjectsWithTransformation( 
913+   String indexName, 
914+   Iterable<T> objects, 
915+   boolean createIfNotExists, 
916+   boolean waitForTasks 
917+ ) { 
918+   return partialUpdateObjectsWithTransformation(indexName, objects, createIfNotExists, waitForTasks, null); 
919+ } 
920+ 
921+ /** 
922+  * Helper: Similar to the `partialUpdateObjects` method but requires a Push connector 
923+  * (https://www.algolia.com/doc/guides/sending-and-managing-data/send-and-update-your-data/connectors/push/) 
924+  * to be created first, in order to transform records before indexing them to Algolia. The 
925+  * `region` must have been passed to the client instantiation method. 
926+  * 
927+  * @param indexName The `indexName` to update `objects` in. 
928+  * @param objects The array of `objects` to update in the given Algolia `indexName`. 
929+  * @param createIfNotExists To be provided if non-existing objects are passed, otherwise, the call 
930+  *     will fail. 
931+  * @param waitForTasks - Whether or not we should wait until every `batch` tasks has been 
932+  *     processed, this operation may slow the total execution time of this method but is more 
933+  *     reliable. 
934+  * @param requestOptions The requestOptions to send along with the query, they will be merged with 
935+  *     the transporter requestOptions. (optional) 
936+  */ 
937+ public <T> WatchResponse partialUpdateObjectsWithTransformation( 
938+   String indexName, 
939+   Iterable<T> objects, 
940+   boolean createIfNotExists, 
941+   boolean waitForTasks, 
942+   RequestOptions requestOptions 
943+ ) { 
944+   return partialUpdateObjectsWithTransformation(indexName, objects, createIfNotExists, waitForTasks, 1000, null); 
945+ } 
946+ 
947+ /** 
948+  * Helper: Similar to the `partialUpdateObjects` method but requires a Push connector 
949+  * (https://www.algolia.com/doc/guides/sending-and-managing-data/send-and-update-your-data/connectors/push/) 
950+  * to be created first, in order to transform records before indexing them to Algolia. The 
951+  * `region` must have been passed to the client instantiation method. 
952+  * 
953+  * @param indexName The `indexName` to update `objects` in. 
954+  * @param objects The array of `objects` to update in the given Algolia `indexName`. 
955+  * @param createIfNotExists To be provided if non-existing objects are passed, otherwise, the call 
956+  *     will fail. 
957+  * @param waitForTasks - Whether or not we should wait until every `batch` tasks has been 
958+  *     processed, this operation may slow the total execution time of this method but is more 
959+  *     reliable. 
960+  * @param batchSize The size of the chunk of `objects`. The number of `batch` calls will be equal 
961+  *     to `length(objects) / batchSize`. 
962+  * @param requestOptions The requestOptions to send along with the query, they will be merged with 
963+  *     the transporter requestOptions. (optional) 
964+  */ 
965+ public <T> WatchResponse partialUpdateObjectsWithTransformation( 
966+   String indexName, 
967+   Iterable<T> objects, 
968+   boolean createIfNotExists, 
969+   boolean waitForTasks, 
970+   int batchSize, 
971+   RequestOptions requestOptions 
972+ ) { 
973+   if (this.ingestionTransporter == null) { 
974+     throw new AlgoliaRuntimeException("`setTransformationRegion` must have been called before calling this method."); 
975+   } 
976+ 
977+   return this.ingestionTransporter.push( 
978+       indexName, 
979+       new PushTaskPayload() 
980+         .setAction( 
981+           createIfNotExists 
982+             ? com.algolia.model.ingestion.Action.PARTIAL_UPDATE_OBJECT 
983+             : com.algolia.model.ingestion.Action.PARTIAL_UPDATE_OBJECT_NO_CREATE 
984+         ) 
985+         .setRecords(this.objectsToPushTaskRecords(objects)), 
986+       waitForTasks, 
987+       requestOptions 
988+     ); 
989+ } 
990+ 
780991/** 
781992 * Helper: Replaces object content of all the given objects according to their respective 
782993 * `objectID` field. The `chunkedBatch` helper is used under the hood, which creates a `batch` 
0 commit comments