1
0
Fork 0
mirror of https://gitlab.com/bramw/baserow.git synced 2025-04-10 15:47:32 +00:00

Resolve "Fix naming collisions for fields in LocalBaserowGroupedAggregateRowsUserServiceType"

This commit is contained in:
Petr Stribny 2025-02-25 03:30:31 +00:00
parent 8ada997b81
commit ca2004ebf5
5 changed files with 202 additions and 113 deletions
backend/src/baserow/contrib/database/fields
enterprise
backend
src/baserow_enterprise/integrations/local_baserow
tests/baserow_enterprise_tests
web-frontend/modules/baserow_enterprise/dashboard/components/widget

View file

@ -2264,7 +2264,11 @@ class FieldAggregationType(Instance):
return self.raw_type().get_aggregation(field.db_column, model_field, field)
def _get_aggregation_dict(
self, queryset: QuerySet, model_field: DjangoField, field: Field
self,
queryset: QuerySet,
model_field: DjangoField,
field: Field,
include_agg_type=False,
) -> dict:
"""
Returns a dictinary defining the aggregation for the queryset.aggregate
@ -2278,14 +2282,15 @@ class FieldAggregationType(Instance):
"""
aggregation = self._get_raw_aggregation(model_field, field.specific)
aggregation_dict = {f"{field.db_column}_raw": aggregation}
key = f"{field.db_column}_{self.type}" if include_agg_type else field.db_column
aggregation_dict = {f"{key}_raw": aggregation}
# Check if the returned aggregations contain a `AnnotatedAggregation`,
# and if so, apply the annotations and only keep the actual aggregation in
# the dict. This is needed because some aggregations require annotated values
# before they work.
if isinstance(aggregation, AnnotatedAggregation):
queryset = queryset.annotate(**aggregation.annotations)
aggregation_dict[field.db_column] = aggregation.aggregation
aggregation_dict[key] = aggregation.aggregation
if self.with_total:
aggregation_dict["total"] = Count("id", distinct=True)

View file

@ -474,7 +474,7 @@ class LocalBaserowGroupedAggregateRowsUserServiceType(
)
combined_agg_dict |= agg_type._get_aggregation_dict(
queryset, model_field, agg_series.field
queryset, model_field, agg_series.field, include_agg_type=True
)
for key, value in combined_agg_dict.items():
@ -484,11 +484,10 @@ class LocalBaserowGroupedAggregateRowsUserServiceType(
def process_individual_result(result: dict):
for agg_series in defined_agg_series:
raw_value = result.pop(f"{agg_series.field.db_column}_raw")
key = f"{agg_series.field.db_column}_{agg_series.aggregation_type}"
raw_value = result.pop(f"{key}_raw")
agg_type = grouped_aggregation_registry.get(agg_series.aggregation_type)
result[
f"{agg_series.field.db_column}"
] = agg_type._compute_final_aggregation(
result[key] = agg_type._compute_final_aggregation(
raw_value, result.get("total", None)
)
if "total" in result:

View file

@ -294,25 +294,29 @@ def test_grouped_aggregate_rows_dispatch_dashboard_data_source(
assert response.status_code == HTTP_200_OK, response_json
assert response_json == {
"result": [
{
f"field_{field.id}": 90.0,
f"field_{field_2.id}": 9.0,
f"field_{field_3.id}": 3.0,
},
{
f"field_{field.id}": 60.0,
f"field_{field_2.id}": 6.0,
f"field_{field_3.id}": 6.0,
},
{
f"field_{field.id}": 30.0,
f"field_{field_2.id}": 3.0,
f"field_{field_3.id}": 6.0,
f"field_{field.id}_sum": 90.0,
f"field_{field_2.id}_sum": 9.0,
f"field_{field_3.id}_sum": 3.0,
},
{
f"field_{field.id}": 20.0,
f"field_{field.id}_sum": 60.0,
f"field_{field_2.id}_sum": 6.0,
f"field_{field_3.id}_sum": 6.0,
},
{
f"field_{field.id}": 10.0,
f"field_{field.id}_sum": 30.0,
f"field_{field_2.id}_sum": 3.0,
f"field_{field_3.id}_sum": 6.0,
},
{
f"field_{field.id}": None,
f"field_{field_2.id}": 100.0,
f"field_{field_3.id}": 100.0,
f"field_{field.id}_sum": None,
f"field_{field_2.id}_sum": 100.0,
f"field_{field_3.id}_sum": 100.0,
},
],
}

View file

@ -955,12 +955,74 @@ def test_grouped_aggregate_rows_service_dispatch(data_fixture):
assert result.data == {
"result": {
f"field_{field.id}": Decimal("20"),
f"field_{field_2.id}": Decimal("8"),
f"field_{field.id}_sum": Decimal("20"),
f"field_{field_2.id}_sum": Decimal("8"),
},
}
@pytest.mark.django_db
def test_grouped_aggregate_rows_service_dispatch_same_agg_fields(data_fixture):
user = data_fixture.create_user()
dashboard = data_fixture.create_dashboard_application(user=user)
table = data_fixture.create_database_table(user=user)
field = data_fixture.create_number_field(table=table)
field_2 = data_fixture.create_number_field(table=table)
view = data_fixture.create_grid_view(user=user, table=table)
integration = data_fixture.create_local_baserow_integration(
application=dashboard, user=user
)
service = data_fixture.create_service(
LocalBaserowGroupedAggregateRows,
integration=integration,
table=table,
view=view,
)
LocalBaserowTableServiceAggregationSeries.objects.create(
service=service, field=field, aggregation_type="min", order=1
)
LocalBaserowTableServiceAggregationSeries.objects.create(
service=service, field=field, aggregation_type="max", order=1
)
LocalBaserowTableServiceAggregationGroupBy.objects.create(
service=service, field=field_2, order=1
)
RowHandler().create_rows(
user,
table,
rows_values=[
{f"field_{field.id}": 2, f"field_{field_2.id}": 1},
{f"field_{field.id}": 4, f"field_{field_2.id}": 1},
{f"field_{field.id}": 6, f"field_{field_2.id}": 1},
{f"field_{field.id}": 8, f"field_{field_2.id}": 1},
{f"field_{field.id}": 1, f"field_{field_2.id}": 2},
{f"field_{field.id}": 3, f"field_{field_2.id}": 2},
{f"field_{field.id}": 9, f"field_{field_2.id}": 2},
{f"field_{field.id}": 10, f"field_{field_2.id}": 2},
],
)
dispatch_context = FakeDispatchContext()
result = ServiceHandler().dispatch_service(service, dispatch_context)
assert result.data == {
"result": [
{
f"field_{field.id}_max": Decimal("8"),
f"field_{field.id}_min": Decimal("2"),
f"field_{field_2.id}": Decimal("1"),
},
{
f"field_{field.id}_max": Decimal("10"),
f"field_{field.id}_min": Decimal("1"),
f"field_{field_2.id}": Decimal("2"),
},
],
}
@pytest.mark.django_db
def test_grouped_aggregate_rows_service_dispatch_with_view(data_fixture):
user = data_fixture.create_user()
@ -1005,8 +1067,8 @@ def test_grouped_aggregate_rows_service_dispatch_with_view(data_fixture):
assert result.data == {
"result": {
f"field_{field.id}": Decimal("6"),
f"field_{field_2.id}": Decimal("4"),
f"field_{field.id}_sum": Decimal("6"),
f"field_{field_2.id}_sum": Decimal("4"),
},
}
@ -1055,8 +1117,8 @@ def test_grouped_aggregate_rows_service_dispatch_with_service_filters(data_fixtu
assert result.data == {
"result": {
f"field_{field.id}": Decimal("6"),
f"field_{field_2.id}": Decimal("4"),
f"field_{field.id}_sum": Decimal("6"),
f"field_{field_2.id}_sum": Decimal("4"),
},
}
@ -1280,8 +1342,8 @@ def test_grouped_aggregate_rows_service_dispatch_with_total_aggregation(data_fix
assert result.data == {
"result": {
f"field_{field.id}": 75.0,
f"field_{field_2.id}": 25.0,
f"field_{field.id}_checked_percentage": 75.0,
f"field_{field_2.id}_not_checked_percentage": 25.0,
},
}
@ -1361,23 +1423,23 @@ def test_grouped_aggregate_rows_service_dispatch_group_by(data_fixture):
assert result.data == {
"result": [
{
f"field_{field.id}": Decimal("1"),
f"field_{field_2.id}": Decimal("1"),
f"field_{field.id}_sum": Decimal("1"),
f"field_{field_2.id}_sum": Decimal("1"),
f"field_{field_3.id}": None,
},
{
f"field_{field.id}": Decimal("1"),
f"field_{field_2.id}": Decimal("1"),
f"field_{field.id}_sum": Decimal("1"),
f"field_{field_2.id}_sum": Decimal("1"),
f"field_{field_3.id}": "Third group",
},
{
f"field_{field.id}": Decimal("8"),
f"field_{field_2.id}": Decimal("6"),
f"field_{field.id}_sum": Decimal("8"),
f"field_{field_2.id}_sum": Decimal("6"),
f"field_{field_3.id}": "First group",
},
{
f"field_{field.id}": Decimal("22"),
f"field_{field_2.id}": Decimal("7"),
f"field_{field.id}_sum": Decimal("22"),
f"field_{field_2.id}_sum": Decimal("7"),
f"field_{field_3.id}": "Second group",
},
]
@ -1428,22 +1490,26 @@ def test_grouped_aggregate_rows_service_dispatch_group_by_id(data_fixture):
"result": [
{
f"field_{field.id}": Decimal("2"),
f"field_{field_2.id}": Decimal("2"),
f"field_{field.id}_sum": Decimal("2"),
f"field_{field_2.id}_sum": Decimal("2"),
"id": 1,
},
{
f"field_{field.id}": Decimal("4"),
f"field_{field_2.id}": Decimal("2"),
f"field_{field.id}_sum": Decimal("4"),
f"field_{field_2.id}_sum": Decimal("2"),
"id": 2,
},
{
f"field_{field.id}": Decimal("6"),
f"field_{field_2.id}": Decimal("2"),
f"field_{field.id}_sum": Decimal("6"),
f"field_{field_2.id}_sum": Decimal("2"),
"id": 3,
},
{
f"field_{field.id}": Decimal("8"),
f"field_{field_2.id}": Decimal("2"),
f"field_{field.id}_sum": Decimal("8"),
f"field_{field_2.id}_sum": Decimal("2"),
"id": 4,
},
]
@ -1556,25 +1622,29 @@ def test_grouped_aggregate_rows_service_dispatch_sort_by_series_with_group_by(
assert result.data == {
"result": [
{
f"field_{field.id}": Decimal("90"),
f"field_{field_2.id}": Decimal("9"),
f"field_{field_3.id}": Decimal("3"),
},
{
f"field_{field.id}": Decimal("60"),
f"field_{field_2.id}": Decimal("6"),
f"field_{field_3.id}": Decimal("6"),
},
{
f"field_{field.id}": Decimal("30"),
f"field_{field_2.id}": Decimal("3"),
f"field_{field_3.id}": Decimal("6"),
f"field_{field.id}_sum": Decimal("90"),
f"field_{field_2.id}_sum": Decimal("9"),
f"field_{field_3.id}_sum": Decimal("3"),
},
{
f"field_{field.id}": Decimal("20"),
f"field_{field.id}_sum": Decimal("60"),
f"field_{field_2.id}_sum": Decimal("6"),
f"field_{field_3.id}_sum": Decimal("6"),
},
{
f"field_{field.id}": Decimal("10"),
f"field_{field.id}_sum": Decimal("30"),
f"field_{field_2.id}_sum": Decimal("3"),
f"field_{field_3.id}_sum": Decimal("6"),
},
{
f"field_{field.id}": None,
f"field_{field_2.id}": Decimal("100"),
f"field_{field_3.id}": Decimal("100"),
f"field_{field.id}_sum": None,
f"field_{field_2.id}_sum": Decimal("100"),
f"field_{field_3.id}_sum": Decimal("100"),
},
],
}
@ -1659,32 +1729,37 @@ def test_grouped_aggregate_rows_service_dispatch_sort_by_series_with_group_by_ro
"result": [
{
f"field_{field.id}": None,
f"field_{field_2.id}": Decimal("5"),
f"field_{field_3.id}": Decimal("1"),
f"field_{field.id}_sum": None,
f"field_{field_2.id}_sum": Decimal("5"),
f"field_{field_3.id}_sum": Decimal("1"),
"id": 5,
},
{
f"field_{field.id}": Decimal("3"),
f"field_{field_2.id}": Decimal("3"),
f"field_{field_3.id}": Decimal("2"),
f"field_{field.id}_sum": Decimal("3"),
f"field_{field_2.id}_sum": Decimal("3"),
f"field_{field_3.id}_sum": Decimal("2"),
"id": 4,
},
{
f"field_{field.id}": Decimal("3"),
f"field_{field_2.id}": Decimal("3"),
f"field_{field_3.id}": Decimal("3"),
f"field_{field.id}_sum": Decimal("3"),
f"field_{field_2.id}_sum": Decimal("3"),
f"field_{field_3.id}_sum": Decimal("3"),
"id": 3,
},
{
f"field_{field.id}": Decimal("2"),
f"field_{field_2.id}": Decimal("2"),
f"field_{field_3.id}": Decimal("3"),
f"field_{field.id}_sum": Decimal("2"),
f"field_{field_2.id}_sum": Decimal("2"),
f"field_{field_3.id}_sum": Decimal("3"),
"id": 2,
},
{
f"field_{field.id}": Decimal("1"),
f"field_{field_2.id}": Decimal("1"),
f"field_{field_3.id}": Decimal("4"),
f"field_{field.id}_sum": Decimal("1"),
f"field_{field_2.id}_sum": Decimal("1"),
f"field_{field_3.id}_sum": Decimal("4"),
"id": 1,
},
],
@ -1766,9 +1841,9 @@ def test_grouped_aggregate_rows_service_dispatch_sort_by_series_without_group_by
# the results are still a dictionary, not sorted on the backend
assert result.data == {
"result": {
f"field_{field.id}": Decimal("9"),
f"field_{field_2.id}": Decimal("14"),
f"field_{field_3.id}": Decimal("13"),
f"field_{field.id}_sum": Decimal("9"),
f"field_{field_2.id}_sum": Decimal("14"),
f"field_{field_3.id}_sum": Decimal("13"),
}
}
@ -1873,23 +1948,23 @@ def test_grouped_aggregate_rows_service_dispatch_sort_by_group_by_field(data_fix
"result": [
{
f"field_{field.id}": None,
f"field_{field_2.id}": Decimal("100"),
f"field_{field_3.id}": Decimal("100"),
f"field_{field_2.id}_sum": Decimal("100"),
f"field_{field_3.id}_sum": Decimal("100"),
},
{
f"field_{field.id}": Decimal("10"),
f"field_{field_2.id}": Decimal("3"),
f"field_{field_3.id}": Decimal("6"),
f"field_{field_2.id}_sum": Decimal("3"),
f"field_{field_3.id}_sum": Decimal("6"),
},
{
f"field_{field.id}": Decimal("20"),
f"field_{field_2.id}": Decimal("6"),
f"field_{field_3.id}": Decimal("6"),
f"field_{field_2.id}_sum": Decimal("6"),
f"field_{field_3.id}_sum": Decimal("6"),
},
{
f"field_{field.id}": Decimal("30"),
f"field_{field_2.id}": Decimal("9"),
f"field_{field_3.id}": Decimal("3"),
f"field_{field_2.id}_sum": Decimal("9"),
f"field_{field_3.id}_sum": Decimal("3"),
},
],
}
@ -1966,32 +2041,32 @@ def test_grouped_aggregate_rows_service_dispatch_sort_by_group_by_row_id(data_fi
"result": [
{
f"field_{field.id}": "",
f"field_{field_2.id}": Decimal("5"),
f"field_{field_3.id}": Decimal("1"),
f"field_{field_2.id}_sum": Decimal("5"),
f"field_{field_3.id}_sum": Decimal("1"),
"id": 5,
},
{
f"field_{field.id}": "A",
f"field_{field_2.id}": Decimal("1"),
f"field_{field_3.id}": Decimal("4"),
f"field_{field_2.id}_sum": Decimal("1"),
f"field_{field_3.id}_sum": Decimal("4"),
"id": 1,
},
{
f"field_{field.id}": "B",
f"field_{field_2.id}": Decimal("3"),
f"field_{field_3.id}": Decimal("2"),
f"field_{field_2.id}_sum": Decimal("3"),
f"field_{field_3.id}_sum": Decimal("2"),
"id": 4,
},
{
f"field_{field.id}": "H",
f"field_{field_2.id}": Decimal("2"),
f"field_{field_3.id}": Decimal("3"),
f"field_{field_2.id}_sum": Decimal("2"),
f"field_{field_3.id}_sum": Decimal("3"),
"id": 2,
},
{
f"field_{field.id}": "I",
f"field_{field_2.id}": Decimal("3"),
f"field_{field_3.id}": Decimal("3"),
f"field_{field_2.id}_sum": Decimal("3"),
f"field_{field_3.id}_sum": Decimal("3"),
"id": 3,
},
],
@ -2211,23 +2286,27 @@ def test_grouped_aggregate_rows_service_dispatch_sort_by_series_with_group_by_ig
"result": [
{
f"field_{field.id}": None,
f"field_{field_2.id}": Decimal("100"),
f"field_{field_3.id}": Decimal("100"),
f"field_{field.id}_sum": None,
f"field_{field_2.id}_sum": Decimal("100"),
f"field_{field_3.id}_sum": Decimal("100"),
},
{
f"field_{field.id}": Decimal("10"),
f"field_{field.id}_sum": Decimal("30"),
f"field_{field_2.id}_sum": Decimal("3"),
f"field_{field_3.id}_sum": Decimal("6"),
},
{
f"field_{field.id}": Decimal("30"),
f"field_{field_2.id}": Decimal("3"),
f"field_{field_3.id}": Decimal("6"),
f"field_{field.id}_sum": Decimal("90"),
f"field_{field_2.id}_sum": Decimal("9"),
f"field_{field_3.id}_sum": Decimal("3"),
},
{
f"field_{field.id}": Decimal("90"),
f"field_{field_2.id}": Decimal("9"),
f"field_{field_3.id}": Decimal("3"),
},
{
f"field_{field.id}": Decimal("60"),
f"field_{field_2.id}": Decimal("6"),
f"field_{field_3.id}": Decimal("6"),
f"field_{field.id}": Decimal("20"),
f"field_{field.id}_sum": Decimal("60"),
f"field_{field_2.id}_sum": Decimal("6"),
f"field_{field_3.id}_sum": Decimal("6"),
},
],
}
@ -2301,19 +2380,19 @@ def test_grouped_aggregate_rows_service_dispatch_max_buckets_sort_on_group_by_fi
assert result.data == {
"result": [
{
f"field_{field.id}": Decimal("10"),
f"field_{field.id}_sum": Decimal("10"),
f"field_{field_2.id}": "A",
},
{
f"field_{field.id}": Decimal("60"),
f"field_{field.id}_sum": Decimal("60"),
f"field_{field_2.id}": "H",
},
{
f"field_{field.id}": Decimal("20"),
f"field_{field.id}_sum": Decimal("20"),
f"field_{field_2.id}": "K",
},
{
f"field_{field.id}": Decimal("30"),
f"field_{field.id}_sum": Decimal("30"),
f"field_{field_2.id}": "L",
},
],
@ -2388,19 +2467,19 @@ def test_grouped_aggregate_rows_service_dispatch_max_buckets_sort_on_series(
assert result.data == {
"result": [
{
f"field_{field.id}": Decimal("10"),
f"field_{field.id}_sum": Decimal("10"),
f"field_{field_2.id}": "A",
},
{
f"field_{field.id}": Decimal("20"),
f"field_{field.id}_sum": Decimal("20"),
f"field_{field_2.id}": "K",
},
{
f"field_{field.id}": Decimal("30"),
f"field_{field.id}_sum": Decimal("30"),
f"field_{field_2.id}": "L",
},
{
f"field_{field.id}": Decimal("40"),
f"field_{field.id}_sum": Decimal("40"),
f"field_{field_2.id}": "Z",
},
],
@ -2475,22 +2554,22 @@ def test_grouped_aggregate_rows_service_dispatch_max_buckets_sort_on_primary_fie
assert result.data == {
"result": [
{
f"field_{field.id}": Decimal("10"),
f"field_{field.id}_sum": Decimal("10"),
f"field_{field_2.id}": "A",
"id": rows[3].id,
},
{
f"field_{field.id}": Decimal("60"),
f"field_{field.id}_sum": Decimal("60"),
f"field_{field_2.id}": "H",
"id": rows[4].id,
},
{
f"field_{field.id}": Decimal("20"),
f"field_{field.id}_sum": Decimal("20"),
f"field_{field_2.id}": "K",
"id": rows[1].id,
},
{
f"field_{field.id}": Decimal("30"),
f"field_{field.id}_sum": Decimal("30"),
f"field_{field_2.id}": "L",
"id": rows[2].id,
},

View file

@ -82,7 +82,7 @@ export default {
const datasets = []
for (const [index, series] of this.seriesConfig.entries()) {
const seriesData = this.result.map((item) => {
return item[series.fieldName]
return item[`${series.fieldName}_${series.aggregationType}`]
})
const label = this.getLabel(series.fieldName, series.aggregationType)
datasets.push({
@ -100,7 +100,9 @@ export default {
const labels = ['']
const datasets = []
for (const [index, series] of this.seriesConfig.entries()) {
const seriesData = [this.result[series.fieldName]]
const seriesData = [
this.result[`${series.fieldName}_${series.aggregationType}`],
]
const label = this.getLabel(series.fieldName, series.aggregationType)
datasets.push({
data: seriesData,