Skip to content

Commit 4bd011a

Browse files
author
Charles Lariviere
committed
feat(aggregation): add support for aggregation name
Signed-off-by: Charles Lariviere <charles@dribbble.com>
1 parent 2a15404 commit 4bd011a

File tree

2 files changed

+47
-4
lines changed

2 files changed

+47
-4
lines changed

src/metabase/mbql/aggregations.py

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,46 @@
11
from typing import List
22

3-
from metabase.mbql.base import Mbql
3+
from metabase.mbql.base import Mbql, Option
44

55

66
class Aggregation(Mbql):
77
function: str
88

9+
def __init__(self, id: int, name: str = None, option: Option = None):
10+
self.name = name
11+
super(Aggregation, self).__init__(id=id, option=option)
12+
913
def compile(self) -> List:
10-
return [self.function, super(Aggregation, self).compile()]
14+
compiled = [self.function, super(Aggregation, self).compile()]
15+
16+
if self.name is not None:
17+
compiled = self.compile_name(compiled, self.name)
18+
19+
return compiled
20+
21+
@staticmethod
22+
def compile_name(compiled, name: str) -> str:
23+
return (
24+
["aggregation-options"]
25+
+ [compiled]
26+
+ [{"name": name, "display-name": name}]
27+
)
1128

1229

1330
class Count(Aggregation):
1431
function = "count"
1532

16-
def __init__(self, id: int = None):
33+
def __init__(self, id: int = None, name: str = None, option: Option = None):
1734
self.id = id
35+
self.name = name
1836

1937
def compile(self) -> List:
20-
return [self.function]
38+
compiled = [self.function]
39+
40+
if self.name is not None:
41+
compiled = self.compile_name(compiled, self.name)
42+
43+
return compiled
2144

2245

2346
class Sum(Aggregation):

tests/mbql/test_aggregations.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,30 @@ class Mock(Aggregation):
1616
aggregation = Mock(id=2, option={"foo": "bar"})
1717
self.assertEqual(["mock", ["field", 2, {"foo": "bar"}]], aggregation.compile())
1818

19+
aggregation = Mock(id=2, name="My Aggregation", option={"foo": "bar"})
20+
self.assertEqual(
21+
[
22+
"aggregation-options",
23+
["mock", ["field", 2, {"foo": "bar"}]],
24+
{"name": "My Aggregation", "display-name": "My Aggregation"},
25+
],
26+
aggregation.compile(),
27+
)
28+
1929
def test_count(self):
2030
"""Ensure Count optionally accepts an id attribute."""
2131
count = Count()
2232
self.assertEqual(["count"], count.compile())
2333

2434
count = Count(id=5)
2535
self.assertEqual(["count"], count.compile())
36+
37+
count = Count(id=5, name="My Count")
38+
self.assertEqual(
39+
[
40+
"aggregation-options",
41+
["count"],
42+
{"name": "My Count", "display-name": "My Count"},
43+
],
44+
count.compile(),
45+
)

0 commit comments

Comments
 (0)