- if len(fields) == 1 and fields[0] == 'count(*)':
- rows.append(Row({fields[0]: table.nrows}))
- else:
- for table_row in table_rows:
- row = Row()
- for field in fields:
- if field == 'rowid':
- row[field] = table_row.nrow
- elif field == '*':
- for col in table.colnames:
- value = table_row[col]
- if type(value) is bytes:
- value = value.decode('utf-8')
- row[col] = value
+ def normalize_field_value(value):
+ if type(value) is bytes:
+ return value.decode('utf-8')
+ elif not type(value) in (int, float, complex):
+ return str(value)
+ else:
+ return value
+
+ def make_get_rowid():
+ if type(table) is tables.table.Table:
+ def get_rowid(row):
+ return int(row.nrow)
+ else:
+ rowid = start - 1
+ def get_rowid(row):
+ nonlocal rowid
+ rowid += 1
+ return rowid
+ return get_rowid
+
+ def make_get_row_value():
+ if type(table) is tables.table.Table:
+ def get_row_value(row, field):
+ return row[field]
+ else:
+ def get_row_value(row, field):
+ return row
+ return get_row_value
+
+ # Get results
+ get_rowid = make_get_rowid()
+ get_row_value = make_get_row_value()
+ if offset:
+ table_rows = table_rows[offset:]
+ count = 0
+ for table_row in table_rows:
+ count += 1
+ if limit is not None and count > limit:
+ break
+ if truncate and max_returned_rows and count > max_returned_rows:
+ truncated = True
+ break
+ row = {}
+ for field in fields:
+ field_name = field
+ if isinstance(field, dict):
+ field_name = field['value']
+ if isinstance(field_name, dict) and 'distinct' in field_name:
+ field_name = field_name['distinct']
+ if field_name == 'rowid':
+ row['rowid'] = get_rowid(table_row)
+ elif field_name == '*':
+ for col in colnames:
+ row[col] = normalize_field_value(get_row_value(table_row, col))
+ elif isinstance(field_name, dict):
+ if field_name.get('count') == '*':
+ row['count(*)'] = int(table.nrows)
+ elif field_name.get('json_type'):
+ field_name = field_name.get('json_type')
+ row['json_type(' + field_name + ')'] = _get_field_type(field_name)