)]}'
{
  "commit": "df71d2ae60e52c191eb85ff87931d7a0801c597c",
  "tree": "b26aa3b731c4c008a68f6ee2ea0b40d58ecf0319",
  "parents": [
    "fb96df117677a47cf75e8e86f7b88bf47dc0e674"
  ],
  "author": {
    "name": "GayathriSrividya",
    "email": "gayathrirajavarapu7@gmail.com",
    "time": "Mon Jun 22 05:55:05 2026 +0530"
  },
  "committer": {
    "name": "GitHub",
    "email": "noreply@github.com",
    "time": "Sun Jun 21 17:25:05 2026 -0700"
  },
  "message": "Fix duplicate filtering path in Arrow task batches (#3448)\n\nCloses #3272\n\n## What this changes\n\nThis PR updates the Arrow scan path in `_task_to_record_batches` to\navoid redundant filtering when there are no positional deletes.\n\n- Keeps predicate pushdown in `Scanner.from_fragment` as the only filter\npath when `positional_deletes` is absent.\n- Applies `current_batch.filter(pyarrow_filter)` only in the\npositional-delete path, after deletes are applied.\n- Preserves empty-batch handling after both delete application and\nconditional filtering.\n\n## Why\n\nThe previous flow could perform an extra table-level refilter even when\nthe scanner already applied the predicate. This change removes that\nstale workaround path while keeping correct behavior for positional\ndelete scenarios.\n\n## Tests\n\nAdded regression coverage in `tests/io/test_pyarrow.py`:\n\n-\n`test_task_to_record_batches_filter_without_positional_deletes_avoids_table_refilter`\n-\n`test_task_to_record_batches_filter_with_positional_deletes_handles_empty_batch`\n\nValidated locally:\n\n- `python -m pytest tests/io/test_pyarrow.py -q -k\n\"task_to_record_batches_nanos or\nfilter_without_positional_deletes_avoids_table_refilter or\nfilter_with_positional_deletes_handles_empty_batch\"`\n- `make lint`\n\n---------\n\nCo-authored-by: Gayathri Srividya Rajavarapu \u003cgayathrir@Gayathris-MacBook-Air.local\u003e\nCo-authored-by: Claude Sonnet 4.6 \u003cnoreply@anthropic.com\u003e\nCo-authored-by: Fokko Driesprong \u003cfokko@apache.org\u003e",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "f03baa524d1d3f6a242889a6cd43423ed17ff01c",
      "old_mode": 33188,
      "old_path": "pyiceberg/io/pyarrow.py",
      "new_id": "076098c75783e28c79c46d5c5d6bf8e66f612ac8",
      "new_mode": 33188,
      "new_path": "pyiceberg/io/pyarrow.py"
    },
    {
      "type": "modify",
      "old_id": "bcbf873c2af65b555a7a2f9b365356d5d8cfa871",
      "old_mode": 33188,
      "old_path": "tests/io/test_pyarrow.py",
      "new_id": "407ec611fdb2f6841150c36c612cae7b34bff353",
      "new_mode": 33188,
      "new_path": "tests/io/test_pyarrow.py"
    }
  ]
}
