Projet

Général

Profil

0002-feeder-create-measure-for-integer-fields-43546.patch

Benjamin Dauvergne, 03 juin 2020 10:09

Télécharger (4,51 ko)

Voir les différences:

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(-)
tests/olap.model
287 287
               "name": "stringCaseSensitive-é",
288 288
               "type": "string",
289 289
               "value": "\"field_stringCaseSensitive-é\""
290
            },
291
            {
292
               "filter": true,
293
               "label": "8th field integer",
294
               "name": "integer",
295
               "type": "string",
296
               "value": "\"field_integer\""
297 290
            }
298 291
         ],
299 292
         "fact_table" : "\"formdata_demande\"",
......
416 409
               "label" : "localisation géographique",
417 410
               "name" : "geolocation",
418 411
               "type" : "point"
412
            },
413
            {
414
               "name": "sum_integer",
415
               "label": "total du champ « 8th field integer »",
416
               "type": "integer",
417
               "expression": "SUM({fact_table}.\"field_integer\")"
419 418
            }
420 419
         ],
421 420
         "name" : "formdata_demande",
wcs_olap/feeder.py
616 616
        self.formdata_json_index.append(varname)
617 617

  
618 618

  
619
def has_digits_validation(field):
620
    return field.validation and field.validation.get('type') == 'digits'
621

  
622

  
619 623
class WcsFormdefFeeder(object):
620 624
    def __init__(self, olap_feeder, formdef, do_feed=True):
621 625
        self.olap_feeder = olap_feeder
......
669 673
            elif field.type == 'bool':
670 674
                field_def = 'boolean'
671 675
            elif field.type == 'string':
672
                field_def = 'varchar'
676
                if has_digits_validation(field):
677
                    field_def = 'integer'
678
                else:
679
                    field_def = 'varchar'
673 680
            else:
674 681
                continue
675 682
            columns[field.varname] = {
......
832 839
                        v = self.get_item_id(field, raw)
833 840
                    else:
834 841
                        v = None
835
                elif field.type in ('string', 'bool'):
842
                elif field.type == 'string':
843
                    if has_digits_validation(field):
844
                        if raw is not None:
845
                            v = int(raw)
846
                    else:
847
                        v = raw
848
                elif field.type == 'bool':
836 849
                    v = raw
837 850

  
838 851
                # unstructured storage of field values
......
1068 1081
                    'filter': True,
1069 1082
                }
1070 1083
            elif field.type == 'string':
1071
                dimension = {
1072
                    'name': dimension_name,
1073
                    'label': dimension_label,
1074
                    'type': 'string',
1075
                    'value': quote(field_name),
1076
                    'filter': True,
1077
                }
1084
                if has_digits_validation(field):
1085
                    # we will define a SUM measure instead
1086
                    cube['measures'].append({
1087
                        'name': 'sum_' + dimension_name,
1088
                        'label': 'total du champ « %s »' % dimension_label,
1089
                        'type': 'integer',
1090
                        'expression': 'SUM({fact_table}.%s)' % quote(field_name),
1091
                    })
1092
                    continue
1093
                else:
1094
                    dimension = {
1095
                        'name': dimension_name,
1096
                        'label': dimension_label,
1097
                        'type': 'string',
1098
                        'value': quote(field_name),
1099
                        'filter': True,
1100
                    }
1078 1101
            else:
1079 1102
                continue
1080 1103
            if join:
wcs_olap/wcs_api.py
202 202
    varname = None
203 203
    in_filters = False
204 204
    anonymise = None
205
    validation = {}
205 206

  
206 207

  
207 208
class Schema(BaseObject):
208
-