Project

General

Profile

« Previous | Next » 

Revision 4078

xml_func.py: simplify(): Apply pass-through optimizations for _if statements with no condition (which means false). This faciliates automated testing after an _if statement has been added, because the put template provided as part of the automated test will only change for those datasources that actually have a condition entry for the _if statement, which greatly reduces the number of tests that need to be accepted. (Note that the path before the _if will still be included as an empty path if there are no other mappings to that table, because the _if statement does not surround it.)

View differences:

inputs/XAL/test/import.specimens.xml.ref
5 5
            <_merge>
6 6
                <1>$InstitutionCode</1>
7 7
                <2>$CollectionCode</2>
8
                <3><_if name="if indirect voucher"><else>$CatalogNumber</else></_if></3>
8
                <3>$CatalogNumber</3>
9 9
            </_merge>
10 10
        </authorlocationcode>
11 11
        <elevation>
......
250 250
                            <definedvalue>$Sex</definedvalue>
251 251
                        </definedvalue>
252 252
                        <specimenreplicate>
253
                            <catalognumber_dwc><_if name="if indirect voucher"><else>$CatalogNumber</else></_if></catalognumber_dwc>
253
                            <catalognumber_dwc>$CatalogNumber</catalognumber_dwc>
254 254
                            <collectioncode_dwc>$CollectionCode</collectioncode_dwc>
255 255
                            <institution_id><party><organizationname>$InstitutionCode</organizationname></party></institution_id>
256 256
                        </specimenreplicate>
inputs/NY/test/import.specimens.xml.ref
8 8
                    <_merge>
9 9
                        <1>$InstitutionCode</1>
10 10
                        <2>$CollectionCode</2>
11
                        <3><_if name="if indirect voucher"><else>$CatalogNumber</else></_if></3>
11
                        <3>$CatalogNumber</3>
12 12
                    </_merge>
13 13
                </4>
14 14
            </_alt>
......
285 285
                            <definedvalue>$Sex</definedvalue>
286 286
                        </definedvalue>
287 287
                        <specimenreplicate>
288
                            <catalognumber_dwc><_if name="if indirect voucher"><else>$CatalogNumber</else></_if></catalognumber_dwc>
288
                            <catalognumber_dwc>$CatalogNumber</catalognumber_dwc>
289 289
                            <collectioncode_dwc>$CollectionCode</collectioncode_dwc>
290 290
                            <institution_id><party><organizationname>$InstitutionCode</organizationname></party></institution_id>
291 291
                            <sourceaccessioncode>$UniqueNYInternalRecordNumber</sourceaccessioncode>
inputs/ACAD/test/import.specimens.xml.ref
13 13
                                <2>$collectionID</2>
14 14
                            </_merge>
15 15
                        </2>
16
                        <3><_if name="if indirect voucher"><else>$catalogNumber</else></_if></3>
16
                        <3>$catalogNumber</3>
17 17
                    </_merge>
18 18
                </4>
19 19
            </_alt>
......
78 78
                    <plantobservation>
79 79
                        <collectionnumber>$recordNumber</collectionnumber>
80 80
                        <specimenreplicate>
81
                            <catalognumber_dwc><_if name="if indirect voucher"><else>$catalogNumber</else></_if></catalognumber_dwc>
81
                            <catalognumber_dwc>$catalogNumber</catalognumber_dwc>
82 82
                            <collectioncode_dwc>
83 83
                                <_merge>
84 84
                                    <1>$collectionCode</1>
inputs/U/test/import.specimens.xml.ref
4 4
        <authorlocationcode>
5 5
            <_alt>
6 6
                <3>$ID</3>
7
                <4><_if name="if indirect voucher"><else>$Barcode</else></_if></4>
7
                <4>$Barcode</4>
8 8
            </_alt>
9 9
        </authorlocationcode>
10 10
        <locationdetermination>
......
147 147
                    <plantobservation>
148 148
                        <collectionnumber>$Number</collectionnumber>
149 149
                        <specimenreplicate>
150
                            <catalognumber_dwc><_if name="if indirect voucher"><else>$Barcode</else></_if></catalognumber_dwc>
150
                            <catalognumber_dwc>$Barcode</catalognumber_dwc>
151 151
                            <sourceaccessioncode>$ID</sourceaccessioncode>
152 152
                        </specimenreplicate>
153 153
                    </plantobservation>
inputs/ARIZ/test/import.specimens.xml.ref
8 8
                    <_merge>
9 9
                        <1>$InstitutionCode</1>
10 10
                        <2>$CollectionCode</2>
11
                        <3><_if name="if indirect voucher"><else>$CatalogNumberNumeric</else></_if></3>
11
                        <3>$CatalogNumberNumeric</3>
12 12
                    </_merge>
13 13
                </4>
14 14
            </_alt>
......
307 307
                            <definedvalue>$Sex</definedvalue>
308 308
                        </definedvalue>
309 309
                        <specimenreplicate>
310
                            <catalognumber_dwc><_if name="if indirect voucher"><else>$CatalogNumberNumeric</else></_if></catalognumber_dwc>
310
                            <catalognumber_dwc>$CatalogNumberNumeric</catalognumber_dwc>
311 311
                            <collectioncode_dwc>$CollectionCode</collectioncode_dwc>
312 312
                            <institution_id><party><organizationname>$InstitutionCode</organizationname></party></institution_id>
313 313
                            <sourceaccessioncode>$GlobalUniqueIdentifier</sourceaccessioncode>
inputs/GBIF/test/import.specimens.xml.ref
5 5
            <_merge>
6 6
                <1>$InstitutionCD</1>
7 7
                <2>$CollectionCD</2>
8
                <3><_if name="if indirect voucher"><else>$CatalogNO</else></_if></3>
8
                <3>$CatalogNO</3>
9 9
            </_merge>
10 10
        </authorlocationcode>
11 11
        <elevation>
......
160 160
                    <collectiondate><_date><date>$LatestDateCollected</date></_date></collectiondate>
161 161
                    <plantobservation>
162 162
                        <specimenreplicate>
163
                            <catalognumber_dwc><_if name="if indirect voucher"><else>$CatalogNO</else></_if></catalognumber_dwc>
163
                            <catalognumber_dwc>$CatalogNO</catalognumber_dwc>
164 164
                            <collectioncode_dwc>$CollectionCD</collectioncode_dwc>
165 165
                            <institution_id><party><organizationname>$InstitutionCD</organizationname></party></institution_id>
166 166
                        </specimenreplicate>
inputs/NCU-NCSC/test/import.specimens.xml.ref
7 7
                <4>
8 8
                    <_merge>
9 9
                        <2>$SeriesName</2>
10
                        <3><_if name="if indirect voucher"><else>$Barcode</else></_if></3>
10
                        <3>$Barcode</3>
11 11
                    </_merge>
12 12
                </4>
13 13
            </_alt>
......
77 77
                    <collectiondate><_date><date>$Collect Date</date></_date></collectiondate>
78 78
                    <plantobservation>
79 79
                        <specimenreplicate>
80
                            <catalognumber_dwc><_if name="if indirect voucher"><else>$Barcode</else></_if></catalognumber_dwc>
80
                            <catalognumber_dwc>$Barcode</catalognumber_dwc>
81 81
                            <collectioncode_dwc>$SeriesName</collectioncode_dwc>
82 82
                            <sourceaccessioncode>$Accession Number</sourceaccessioncode>
83 83
                        </specimenreplicate>
inputs/SpeciesLink/test/import.specimens.xml.ref
26 26
                            </_merge>
27 27
                        </2>
28 28
                        <3>
29
                            <_if name="if indirect voucher">
30
                                <else>
31
                                    <_alt>
32
                                        <0>$dwc_dwcore_CatalogNumber</0>
33
                                        <1>$conceptual_darwin_2003_1_0_CatalogNumber</1>
34
                                        <2>$dwc_terms_catalogNumber</2>
35
                                    </_alt>
36
                                </else>
37
                            </_if>
29
                            <_alt>
30
                                <0>$dwc_dwcore_CatalogNumber</0>
31
                                <1>$conceptual_darwin_2003_1_0_CatalogNumber</1>
32
                                <2>$dwc_terms_catalogNumber</2>
33
                            </_alt>
38 34
                        </3>
39 35
                    </_merge>
40 36
                </4>
......
419 415
                        </definedvalue>
420 416
                        <specimenreplicate>
421 417
                            <catalognumber_dwc>
422
                                <_if name="if indirect voucher">
423
                                    <else>
424
                                        <_alt>
425
                                            <0>$dwc_dwcore_CatalogNumber</0>
426
                                            <1>$conceptual_darwin_2003_1_0_CatalogNumber</1>
427
                                            <2>$dwc_terms_catalogNumber</2>
428
                                        </_alt>
429
                                    </else>
430
                                </_if>
418
                                <_alt>
419
                                    <0>$dwc_dwcore_CatalogNumber</0>
420
                                    <1>$conceptual_darwin_2003_1_0_CatalogNumber</1>
421
                                    <2>$dwc_terms_catalogNumber</2>
422
                                </_alt>
431 423
                            </catalognumber_dwc>
432 424
                            <collectioncode_dwc>
433 425
                                <_merge>
inputs/MO/test/import.specimens.xml.ref
5 5
            <_merge>
6 6
                <1>$InstitutionCode</1>
7 7
                <2>$CollectionCode</2>
8
                <3><_if name="if indirect voucher"><else>$CatalogNumber</else></_if></3>
8
                <3>$CatalogNumber</3>
9 9
            </_merge>
10 10
        </authorlocationcode>
11 11
        <elevation>
......
239 239
                    <plantobservation>
240 240
                        <collectionnumber>$CollectorNumber</collectionnumber>
241 241
                        <specimenreplicate>
242
                            <catalognumber_dwc><_if name="if indirect voucher"><else>$CatalogNumber</else></_if></catalognumber_dwc>
242
                            <catalognumber_dwc>$CatalogNumber</catalognumber_dwc>
243 243
                            <collectioncode_dwc>$CollectionCode</collectioncode_dwc>
244 244
                            <institution_id><party><organizationname>$InstitutionCode</organizationname></party></institution_id>
245 245
                        </specimenreplicate>
inputs/QMOR/test/import.specimens.xml.ref
13 13
                                <2>$collectionID</2>
14 14
                            </_merge>
15 15
                        </2>
16
                        <3><_if name="if indirect voucher"><else>$catalogNumber</else></_if></3>
16
                        <3>$catalogNumber</3>
17 17
                    </_merge>
18 18
                </4>
19 19
            </_alt>
......
198 198
                            <definedvalue>$sex</definedvalue>
199 199
                        </definedvalue>
200 200
                        <specimenreplicate>
201
                            <catalognumber_dwc><_if name="if indirect voucher"><else>$catalogNumber</else></_if></catalognumber_dwc>
201
                            <catalognumber_dwc>$catalogNumber</catalognumber_dwc>
202 202
                            <collectioncode_dwc>
203 203
                                <_merge>
204 204
                                    <1>$collectionCode</1>
lib/xml_func.py
77 77
def simplify(node):
78 78
    '''Simplifies the XML functions in an XML tree.
79 79
    * Merges nodes tagged as mergable
80
    * Applies a pass-through optimization for aggregating functions with one arg
80
    * Applies pass-through optimizations for XML functions
81 81
    '''
82 82
    for child in xml_dom.NodeElemIter(node): simplify(child)
83 83
    merge_tagged(node)
84 84
    
85
    name = node.tagName
86
    if not is_func_name(name): return # not a function
85
    func_name = node.tagName
86
    if not is_func_name(func_name): return # not a function
87 87
    
88
    items = list(xml_dom.NodeElemIter(node))
88
    params = list(xml_dom.NodeElemIter(node))
89 89
    
90
    if len(items) == 1 and items[0].tagName.isdigit(): # single numeric param
91
        # pass-through optimization for aggregating functions with one arg
92
        xml_dom.replace(node, items[0].firstChild) # use first arg's value
90
    # Pass-through optimizations
91
    if len(params) == 1: # single arg
92
        param = params[0]
93
        name = param.tagName
94
        value = param.firstChild
95
        
96
        is_agg_func = name.isdigit()
97
        is_if_no_cond = func_name = '_if' # no if condition means False
98
        if is_agg_func or (is_if_no_cond and name == 'else'):
99
            xml_dom.replace(node, value)
100
        elif is_if_no_cond and name == 'then': xml_dom.remove(node)
93 101

  
94 102
def process(node, on_error=exc.reraise, is_rel_func=None, db=None):
95 103
    '''Evaluates the XML functions in an XML tree.

Also available in: Unified diff