Projet

Général

Profil

0001-feeder-define-all-joins-38066.patch

Benjamin Dauvergne, 04 décembre 2019 10:28

Télécharger (7,96 ko)

Voir les différences:

Subject: [PATCH] feeder: define all joins (#38066)

* join with the dates table must be inner because we do not want to
see results for forms outside the dates table (every form must have a
receipt_time),
* all other joins must be left because form's schemas are dynamic and
dimension can be absent from older forms but we still want to count them.
 tests/olap.model   | 52 ++++++++++++++++++++++++++++++----------------
 wcs_olap/feeder.py | 12 ++++++++---
 2 files changed, 43 insertions(+), 21 deletions(-)
tests/olap.model
82 82
               "detail" : "date",
83 83
               "master" : "receipt_time",
84 84
               "name" : "receipt_time",
85
               "table" : "dates"
85
               "table" : "dates",
86
               "kind": "right"
86 87
            },
87 88
            {
88 89
               "detail" : "id",
89 90
               "master" : "channel_id",
90 91
               "name" : "channel",
91
               "table" : "channel"
92
               "table" : "channel",
93
               "kind": "left"
92 94
            },
93 95
            {
94 96
               "detail" : "id",
95 97
               "master" : "formdef_id",
96 98
               "name" : "formdef",
97
               "table" : "formdef"
99
               "table" : "formdef",
100
               "kind": "left"
98 101
            },
99 102
            {
100 103
               "detail" : "id",
......
107 110
               "detail" : "id",
108 111
               "master" : "hour_id",
109 112
               "name" : "hour",
110
               "table" : "hour"
113
               "table" : "hour",
114
               "kind": "right"
111 115
            },
112 116
            {
113 117
               "detail" : "id",
114 118
               "master" : "generic_status_id",
115 119
               "name" : "generic_status",
116
               "table" : "status"
120
               "table" : "status",
121
               "kind": "left"
117 122
            },
118 123
            {
119 124
               "detail" : "id",
120
               "kind" : "inner",
121 125
               "master" : "first_agent_id",
122 126
               "name" : "agent",
123
               "table" : "agent"
127
               "table" : "agent",
128
               "kind" : "left"
124 129
            }
125 130
         ],
126 131
         "json_field" : "json_data",
......
290 295
               "detail" : "date",
291 296
               "master" : "receipt_time",
292 297
               "name" : "receipt_time",
293
               "table" : "dates"
298
               "table" : "dates",
299
               "kind" : "right"
294 300
            },
295 301
            {
296 302
               "detail" : "id",
297 303
               "master" : "channel_id",
298 304
               "name" : "channel",
299
               "table" : "channel"
305
               "table" : "channel",
306
               "kind" : "left"
300 307
            },
301 308
            {
302 309
               "detail" : "id",
303 310
               "master" : "formdef_id",
304 311
               "name" : "formdef",
305
               "table" : "formdef"
312
               "table" : "formdef",
313
               "kind" : "left"
306 314
            },
307 315
            {
308 316
               "detail" : "id",
309 317
               "kind" : "left",
310 318
               "master" : "formdef.category_id",
311 319
               "name" : "category",
312
               "table" : "category"
320
               "table" : "category",
321
               "kind" : "left"
313 322
            },
314 323
            {
315 324
               "detail" : "id",
316 325
               "master" : "hour_id",
317 326
               "name" : "hour",
318
               "table" : "hour"
327
               "table" : "hour",
328
               "kind" : "right"
319 329
            },
320 330
            {
321 331
               "detail" : "id",
322 332
               "master" : "generic_status_id",
323 333
               "name" : "generic_status",
324
               "table" : "status"
334
               "table" : "status",
335
               "kind" : "left"
325 336
            },
326 337
            {
327 338
               "detail" : "id",
328 339
               "kind" : "inner",
329 340
               "master" : "first_agent_id",
330 341
               "name" : "agent",
331
               "table" : "agent"
342
               "table" : "agent",
343
               "kind" : "left"
332 344
            },
333 345
            {
334 346
               "detail" : "id",
335 347
               "master" : "status_id",
336 348
               "name" : "status",
337
               "table" : "\"status_demande\""
349
               "table" : "\"status_demande\"",
350
               "kind" : "left"
338 351
            },
339 352
            {
340 353
               "detail" : "id",
341 354
               "master" : "\"function__receiver\"",
342 355
               "name" : "function__receiver",
343
               "table" : "role"
356
               "table" : "role",
357
               "kind" : "left"
344 358
            },
345 359
            {
346 360
               "detail" : "id",
347 361
               "master" : "\"field_item\"",
348 362
               "name" : "item",
349
               "table" : "\"formdata_demande_field_item\""
363
               "table" : "\"formdata_demande_field_item\"",
364
               "kind" : "left"
350 365
            },
351 366
            {
352 367
               "detail" : "id",
353 368
               "master" : "\"field_itemOpen\"",
354 369
               "name" : "itemOpen",
355
               "table" : "\"formdata_demande_field_itemOpen\""
370
               "table" : "\"formdata_demande_field_itemOpen\"",
371
               "kind" : "left"
356 372
            }
357 373
         ],
358 374
         "key" : "id",
wcs_olap/feeder.py
121 121
                    'table': 'dates',
122 122
                    'detail': 'date',
123 123
                    'master': 'receipt_time',
124
                    'kind': 'right',
124 125
                },
125 126
                {
126 127
                    'name': 'channel',
127 128
                    'table': 'channel',
128 129
                    'master': 'channel_id',
129 130
                    'detail': 'id',
131
                    'kind': 'left',
130 132
                },
131 133
                {
132 134
                    'name': 'formdef',
133 135
                    'table': 'formdef',
134 136
                    'master': 'formdef_id',
135 137
                    'detail': 'id',
138
                    'kind': 'left',
136 139
                },
137 140
                {
138 141
                    'name': 'category',
......
146 149
                    'table': 'hour',
147 150
                    'master': 'hour_id',
148 151
                    'detail': 'id',
152
                    'kind': 'right',
149 153
                },
150 154
                {
151 155
                    'name': 'generic_status',
152 156
                    'table': 'status',
153 157
                    'master': 'generic_status_id',
154 158
                    'detail': 'id',
159
                    'kind': 'left',
155 160
                },
156 161
                {
157 162
                    'name': 'agent',
158 163
                    'table': 'agent',
159 164
                    'master': 'first_agent_id',
160 165
                    'detail': 'id',
161
                    'kind': 'inner',
166
                    'kind': 'left',
162 167
                },
163 168
            ],
164 169
            'dimensions': [
......
930 935
            'table': quote(self.status_table_name),
931 936
            'master': 'status_id',
932 937
            'detail': 'id',
938
            'kind': 'left',
933 939
        })
934 940
        cube['dimensions'].append({
935 941
            'name': 'status',
......
948 954
                'table': 'role',
949 955
                'master': quote(at),
950 956
                'detail': 'id',
957
                'kind': 'left',
951 958
            })
952 959
            cube['dimensions'].append({
953 960
                'name': at,
......
998 1005
                    'table': quote(table_name),
999 1006
                    'master': quote('field_%s' % field.varname),
1000 1007
                    'detail': 'id',
1008
                    'kind': 'left',
1001 1009
                }
1002
                if not field.required:
1003
                    join['kind'] = 'full'
1004 1010
                dimension = {
1005 1011
                    'name': field.varname,
1006 1012
                    'label': field.label.lower(),
1007
-