)]}'
{
  "commit": "898d73de20346bba7241907bb18cba47da53e9a9",
  "tree": "2a462b3bbae08b97d637c90a91c9786236553f1b",
  "parents": [
    "d07fdb3ef7d211920f40d0106fa50161c0bf20ce"
  ],
  "author": {
    "name": "Tim Saucer",
    "email": "timsaucer@gmail.com",
    "time": "Tue Apr 07 09:01:36 2026 -0400"
  },
  "committer": {
    "name": "GitHub",
    "email": "noreply@github.com",
    "time": "Tue Apr 07 09:01:36 2026 -0400"
  },
  "message": "Add missing aggregate functions (#1471)\n\n* Add missing aggregate functions: grouping, percentile_cont, var_population\n\nExpose upstream DataFusion aggregate functions that were not yet\navailable in the Python API. Closes #1454.\n\n- grouping: returns grouping set membership indicator (rewritten by\n  the ResolveGroupingFunction analyzer rule before physical planning)\n- percentile_cont: computes exact percentile using continuous\n  interpolation (unlike approx_percentile_cont which uses t-digest)\n- var_population: alias for var_pop\n\nCo-Authored-By: Claude Opus 4.6 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* Fix grouping() distinct parameter type for API consistency\n\nCo-Authored-By: Claude Opus 4.6 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* Improve aggregate function tests and docstrings per review feedback\n\nAdd docstring example to grouping(), parametrize percentile_cont tests,\nand add multi-column grouping test case.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* Add GroupingSet.rollup, .cube, and .grouping_sets factory methods\n\nExpose ROLLUP, CUBE, and GROUPING SETS via the DataFrame API by adding\nstatic methods on GroupingSet that construct the corresponding Expr\nvariants. Update grouping() docstring and tests to use the new API.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* Remove _GroupingSetInternal alias, use expr_internal.GroupingSet directly\n\nCo-Authored-By: Claude Opus 4.6 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* Parametrize grouping set tests for rollup and cube\n\nCo-Authored-By: Claude Opus 4.6 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* Add grouping sets documentation and note grouping() alias limitation\n\nAdd user documentation for GroupingSet.rollup, .cube, and\n.grouping_sets with Pokemon dataset examples. Document the upstream\nalias limitation (apache/datafusion#21411) in both the grouping()\ndocstring and the aggregation user guide.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* Add grouping sets note to DataFrame.aggregate() docstring\n\nCo-Authored-By: Claude Opus 4.6 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* Address PR review feedback: add quantile_cont alias and simplify examples\n\n- Add quantile_cont as alias for percentile_cont (matches upstream)\n- Replace pa.concat_arrays batch pattern with collect_column() in docstrings\n- Add percentile_cont, quantile_cont, var_population to docs function list\n\nCo-Authored-By: Claude Opus 4.6 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* Accept string column names in GroupingSet factory methods\n\nGroupingSet.rollup(), .cube(), and .grouping_sets() now accept both\nExpr objects and string column names, consistent with DataFrame.aggregate().\n\nCo-Authored-By: Claude Opus 4.6 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* Add agent instructions to keep aggregation/window docs in sync\n\nCo-Authored-By: Claude Opus 4.6 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* dfn is already available globally\n\n* Remove unnecessary import on doctest\n\n---------\n\nCo-authored-by: Claude Opus 4.6 (1M context) \u003cnoreply@anthropic.com\u003e",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "f6fdfbd9053342ec899d3cb9bb606ebaa58bf38d",
      "old_mode": 33188,
      "old_path": "AGENTS.md",
      "new_id": "86c2e9c3bd81798f65e79ca7c49a46fd1d1038db",
      "new_mode": 33188,
      "new_path": "AGENTS.md"
    },
    {
      "type": "modify",
      "old_id": "549a866ed8a578b07640496f017805d1eefbc437",
      "old_mode": 33188,
      "old_path": "crates/core/src/expr/grouping_set.rs",
      "new_id": "11d8f4fcd3966408b3260d72dee572ca309e0c26",
      "new_mode": 33188,
      "new_path": "crates/core/src/expr/grouping_set.rs"
    },
    {
      "type": "modify",
      "old_id": "74654ce46c39c95c8d3256d237f031add85a8306",
      "old_mode": 33188,
      "old_path": "crates/core/src/functions.rs",
      "new_id": "f173aaa51b461d7a56767eb219eb4ce5f2c56a5e",
      "new_mode": 33188,
      "new_path": "crates/core/src/functions.rs"
    },
    {
      "type": "modify",
      "old_id": "e458e5fcb20c97a1b6a29396b28bc7618d32b4ee",
      "old_mode": 33188,
      "old_path": "docs/source/user-guide/common-operations/aggregations.rst",
      "new_id": "de24a2ba519bbeb9612ea0252674b3d9ea841fe7",
      "new_mode": 33188,
      "new_path": "docs/source/user-guide/common-operations/aggregations.rst"
    },
    {
      "type": "modify",
      "old_id": "10e2a913fd94cd517d0bfd87cc1f16cb033f3fac",
      "old_mode": 33188,
      "old_path": "python/datafusion/dataframe.py",
      "new_id": "9907eae8bb0d82ad443f256130104acb77967c3c",
      "new_mode": 33188,
      "new_path": "python/datafusion/dataframe.py"
    },
    {
      "type": "modify",
      "old_id": "14753a4f5818357f46d597353f0f784171e2cb9f",
      "old_mode": 33188,
      "old_path": "python/datafusion/expr.py",
      "new_id": "35388468c510a48cc5b51beb99f7ccded8bc73f3",
      "new_mode": 33188,
      "new_path": "python/datafusion/expr.py"
    },
    {
      "type": "modify",
      "old_id": "aa7f287469c679770c88392d2dc588987ba737bd",
      "old_mode": 33188,
      "old_path": "python/datafusion/functions.py",
      "new_id": "9dfabb62d4e5f64ff53f9cc30a9df84f4288224e",
      "new_mode": 33188,
      "new_path": "python/datafusion/functions.py"
    },
    {
      "type": "modify",
      "old_id": "4e99fa9e3e23e8490a332def5532a886a2bbcd1f",
      "old_mode": 33188,
      "old_path": "python/tests/test_functions.py",
      "new_id": "11e94af1caf2671a137f9ea66c02e270c8dfa968",
      "new_mode": 33188,
      "new_path": "python/tests/test_functions.py"
    }
  ]
}
