- fields = execute("SELECT id, name FROM fields WHERE name IN (%s)" \
- % ','.join('%r' % (field,) for field in fields)).fetchall()
- if parent == 0: # get all files
- field_id = execute("SELECT id FROM fields WHERE name=?", \
- ('cn',)).fetchone()[0]
- #data_ids = [_id[0] for _id in execute("SELECT DISTINCT id FROM \
- # data").fetchall()]
- data_ids = [_id[0] for _id in execute("SELECT DISTINCT id FROM \
- data WHERE value LIKE '%s%%' AND field_id=? LIMIT 50" % pattern.capitalize(), (field_id,)).fetchall()]
- else: # get files for selected parent
- data_ids = [_id[0] for _id in execute("SELECT data_id FROM \
- relation WHERE struct_id=?", (parent,)).fetchall()]
- for data_id in data_ids:
- items_dict[data_id] = {}
- for field_id, field_name in fields:
- field_value = execute("SELECT value FROM data WHERE id=? \
- AND field_id=?", (data_id, field_id)).fetchone()[0]
- items_dict[data_id][field_name] = field_value
+ fields = dict(execute("SELECT id, name FROM fields WHERE name IN (%s)" \
+ % ','.join('%r' % (field,) for field in fields)).fetchall())
+ """
+ query = "SELECT id, field_id, value FROM data \
+ left join relation on relation.data_id=data.id \
+ where relation.struct_id=? and field_id in (%s)"
+ """
+ query = "SELECT id, field_id, value FROM data \
+ WHERE id IN (SELECT data_id FROM relation WHERE struct_id=?) \
+ AND field_id IN (%s)"
+ data = execute(query % ','.join('%r' % f for f in fields.keys()), \
+ (parent,)).fetchall()
+ for data_id, field_id, value in data:
+ if not items_dict.has_key(data_id):
+ items_dict[data_id] = {}
+ items_dict[data_id][fields[int(field_id)]] = value