axreldable commented on code in PR #1145:
URL: https://github.com/apache/arrow-java/pull/1145#discussion_r3254785710


##########
vector/src/main/java/org/apache/arrow/vector/VectorSchemaRoot.java:
##########
@@ -226,7 +240,10 @@ public VectorSchemaRoot removeVector(int index) {
     List<FieldVector> newVectors = new ArrayList<>();
     for (int i = 0; i < fieldVectors.size(); i++) {
       if (i != index) {
-        newVectors.add(fieldVectors.get(i));
+        FieldVector v = fieldVectors.get(i);
+        TransferPair transferPair = v.getTransferPair(v.getAllocator());
+        transferPair.transfer();
+        newVectors.add((FieldVector) transferPair.getTo());

Review Comment:
   nit: Consider extracting the transferring logic into a separate method to 
avoid code duplication.
   e.g.
   ```
   private static FieldVector transferVector(FieldVector vector) {
       TransferPair transferPair = 
vector.getTransferPair(vector.getAllocator());
       transferPair.transfer();
       return (FieldVector) transferPair.getTo();
     }
   ```



##########
vector/src/main/java/org/apache/arrow/vector/VectorSchemaRoot.java:
##########
@@ -201,23 +205,33 @@ public VectorSchemaRoot addVector(int index, FieldVector 
vector) {
     Preconditions.checkNotNull(vector);
     Preconditions.checkArgument(index >= 0 && index <= fieldVectors.size());
     List<FieldVector> newVectors = new ArrayList<>();
-    if (index == fieldVectors.size()) {
-      newVectors.addAll(fieldVectors);
-      newVectors.add(vector);
-    } else {
-      for (int i = 0; i < fieldVectors.size(); i++) {
-        if (i == index) {
-          newVectors.add(vector);
-        }
-        newVectors.add(fieldVectors.get(i));
+    for (int i = 0; i < fieldVectors.size(); i++) {
+      if (i == index) {
+        TransferPair addPair = vector.getTransferPair(vector.getAllocator());
+        addPair.transfer();
+        newVectors.add((FieldVector) addPair.getTo());
       }
+      FieldVector v = fieldVectors.get(i);
+      TransferPair transferPair = v.getTransferPair(v.getAllocator());
+      transferPair.transfer();
+      newVectors.add((FieldVector) transferPair.getTo());
+    }
+    if (index == fieldVectors.size()) {
+      TransferPair addPair = vector.getTransferPair(vector.getAllocator());
+      addPair.transfer();
+      newVectors.add((FieldVector) addPair.getTo());
     }
     return new VectorSchemaRoot(newVectors);
   }
 
   /**
    * Remove vector from the record batch, producing a new VectorSchemaRoot.
    *
+   * <p>Buffer ownership is transferred to the returned root via {@link 
TransferPair}. After this
+   * operation, the vectors in this root are left in a transferred (empty) 
state. The removed
+   * vector's data is not transferred and is released. This root can be reused 
by calling {@link

Review Comment:
   > The removed vector's data is not transferred and is released.
   
   `is released` is not 100% accurate and can be confusing. The vector remains 
in the original schema root until it's closed/cleared.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to