Project

General

Profile

« Previous | Next » 

Revision 1136

bin/map: DB inputs: Get all rows in one query (hopefully a significant optimization). Allow maps to contain entries for columns that are not in the DB table.

View differences:

bin/map
156 156
        elif in_is_db:
157 157
            assert in_is_xpaths
158 158
            
159
            import db_xml
159
            in_db = connect_db(in_db_config)
160
            in_pkeys = {}
160 161
            
161
            in_root_xml = xpath.path2xml(in_root)
162
            cur = sql.select(in_db, table=in_root, fields=None, conds=None,
163
                limit=end, start=0)
164
            col_idxs = dict((v, i) for i, v in enumerate(sql.col_names(cur)))
165
            
166
            mappings_new = []
162 167
            for i, mapping in enumerate(mappings):
163 168
                in_, out = mapping
164 169
                if metadata_value(in_) == None:
165
                    mappings[i] = (xpath.path2xml(in_root+'/'+in_), out)
170
                    try: mapping = (col_idxs[in_], out)
171
                    except KeyError: continue
172
                mappings_new.append(mapping)
173
            mappings = mappings_new
166 174
            
167
            in_db = connect_db(in_db_config)
168
            in_pkeys = {}
169
            def get_value(in_, row):
170
                pkey, = row
171
                in_ = in_.cloneNode(True) # don't modify orig value!
172
                xml_dom.set_id(xpath.get(in_, in_root)[0], pkey)
173
                value = sql.value_or_none(db_xml.get(in_db, in_, in_pkeys))
174
                if value != None: return str(value)
175
                else: return None
176
            row_ct = map_rows(get_value, sql.rows(db_xml.get(in_db, in_root_xml,
177
                in_pkeys, end, 0)))
175
            row_ct = map_rows(lambda in_, row: util.cast(str, row[in_]),
176
                sql.rows(cur))
177
            
178 178
            in_db.close()
179 179
        elif in_is_xml:
180 180
            def get_value(in_, row):

Also available in: Unified diff