From 31d36969439027d7a209d3d2dde47abd8c903e33 Mon Sep 17 00:00:00 2001 From: Benjamin Dauvergne Date: Wed, 3 Jun 2020 10:06:41 +0200 Subject: [PATCH 2/4] feeder: create measure for integer fields (#43546) --- tests/olap.model | 13 ++++++------- wcs_olap/feeder.py | 41 ++++++++++++++++++++++++++++++++--------- wcs_olap/wcs_api.py | 1 + 3 files changed, 39 insertions(+), 16 deletions(-) diff --git a/tests/olap.model b/tests/olap.model index 8ef43ac..2e63cc3 100644 --- a/tests/olap.model +++ b/tests/olap.model @@ -287,13 +287,6 @@ "name": "stringCaseSensitive-é", "type": "string", "value": "\"field_stringCaseSensitive-é\"" - }, - { - "filter": true, - "label": "8th field integer", - "name": "integer", - "type": "string", - "value": "\"field_integer\"" } ], "fact_table" : "\"formdata_demande\"", @@ -416,6 +409,12 @@ "label" : "localisation géographique", "name" : "geolocation", "type" : "point" + }, + { + "name": "sum_integer", + "label": "total du champ « 8th field integer »", + "type": "integer", + "expression": "SUM({fact_table}.\"field_integer\")" } ], "name" : "formdata_demande", diff --git a/wcs_olap/feeder.py b/wcs_olap/feeder.py index a48f155..f671e91 100644 --- a/wcs_olap/feeder.py +++ b/wcs_olap/feeder.py @@ -616,6 +616,10 @@ CREATE TABLE public.dates AS (SELECT self.formdata_json_index.append(varname) +def has_digits_validation(field): + return field.validation and field.validation.get('type') == 'digits' + + class WcsFormdefFeeder(object): def __init__(self, olap_feeder, formdef, do_feed=True): self.olap_feeder = olap_feeder @@ -669,7 +673,10 @@ class WcsFormdefFeeder(object): elif field.type == 'bool': field_def = 'boolean' elif field.type == 'string': - field_def = 'varchar' + if has_digits_validation(field): + field_def = 'integer' + else: + field_def = 'varchar' else: continue columns[field.varname] = { @@ -832,7 +839,13 @@ class WcsFormdefFeeder(object): v = self.get_item_id(field, raw) else: v = None - elif field.type in ('string', 'bool'): + elif field.type == 'string': + if has_digits_validation(field): + if raw is not None: + v = int(raw) + else: + v = raw + elif field.type == 'bool': v = raw # unstructured storage of field values @@ -1068,13 +1081,23 @@ class WcsFormdefFeeder(object): 'filter': True, } elif field.type == 'string': - dimension = { - 'name': dimension_name, - 'label': dimension_label, - 'type': 'string', - 'value': quote(field_name), - 'filter': True, - } + if has_digits_validation(field): + # we will define a SUM measure instead + cube['measures'].append({ + 'name': 'sum_' + dimension_name, + 'label': 'total du champ « %s »' % dimension_label, + 'type': 'integer', + 'expression': 'SUM({fact_table}.%s)' % quote(field_name), + }) + continue + else: + dimension = { + 'name': dimension_name, + 'label': dimension_label, + 'type': 'string', + 'value': quote(field_name), + 'filter': True, + } else: continue if join: diff --git a/wcs_olap/wcs_api.py b/wcs_olap/wcs_api.py index 5ab52a3..b175842 100644 --- a/wcs_olap/wcs_api.py +++ b/wcs_olap/wcs_api.py @@ -202,6 +202,7 @@ class Field(BaseObject): varname = None in_filters = False anonymise = None + validation = {} class Schema(BaseObject): -- 2.26.2