diff --git a/CHANGELOG.md b/CHANGELOG.md index 8e114a9..79b651c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,9 +1,12 @@ ## Change Log +* **master** + * Added `field.rows` and `index.group_by` calls. + * **v1.2.0** (2018-12-21) * **Compatible with Pilosa 1.2** * Added `track_existence` index option. - * Added `not_` index method to support `Not` queries. The corresponding index must be created with `track_existence=True`. + * Added `not_` index method to support `Not` queries. The corresponding index must be created with `track_existence=True`. * Added mutex and bool fields. * Added `field.clear_row`, `field.store` and `index.options` calls. * Added support for roaring importing `RowIDColumnID` with timestamp data. diff --git a/docs/data-model-queries.md b/docs/data-model-queries.md index 103bb8d..920e07f 100644 --- a/docs/data-model-queries.md +++ b/docs/data-model-queries.md @@ -103,31 +103,33 @@ Please check [Pilosa documentation](https://www.pilosa.com/docs) for PQL details Index: -* `union(self, *rows)` -* `intersect(self, *rows)` -* `difference(self, *rows)` -* `count(self, row)` -* `set_column_attrs(self, column_id, attrs)` -* `xor(self, *rows)` -* `not_(self, row)` -* `options(self, row_query, column_attrs=False, exclude_columns=False, exclude_row_attrs=False, shards=[])` +* `union(*rows)` +* `intersect(*rows)` +* `difference(*rows)` +* `count(row)` +* `set_column_attrs(column_id, attrs)` +* `xor(*rows)` +* `not_(row)` +* `options(row_query, column_attrs=False, exclude_columns=False, exclude_row_attrs=False, shards=[])` +* `group_by(*rows_queries, limit=0, filter=None)` Field: -* `row(self, row_id)` -* `set(self, row_id, column_id, timestamp=None)` -* `clear(self, row_id, column_id)` -* `topn(self, n, row=None, field="", *values)` -* `range(self, row_id, start, end)` -* `set_row_attrs(self, row_id, attrs)` -* `lt(self, n)` -* `lte(self, n)` -* `gt(self, n)` -* `gte(self, n)` -* `between(self, a, b)` -* `sum(self, row=None)` -* `min(self, row=None)` -* `max(self, row=None)` -* `setvalue(self, column_id, value)` -* `store(self, row_query, row)` -* `clear_row(self, row)` +* `row(row_id)` +* `set(row_id, column_id, timestamp=None)` +* `clear(row_id, column_id)` +* `topn(n, row=None, field="", *values)` +* `range(row_id, start, end)` +* `set_row_attrs(row_id, attrs)` +* `lt(n)` +* `lte(n)` +* `gt(n)` +* `gte(n)` +* `between(a, b)` +* `sum(row=None)` +* `min(row=None)` +* `max(row=None)` +* `setvalue(column_id, value)` +* `store(row_query, row)` +* `clear_row(row)` +* `rows(prev_row=None, limit=0, column=None)` \ No newline at end of file diff --git a/integration_tests/test_client_it.py b/integration_tests/test_client_it.py index e74c27e..e3165a9 100644 --- a/integration_tests/test_client_it.py +++ b/integration_tests/test_client_it.py @@ -44,6 +44,7 @@ from pilosa.client import Client, URI, Cluster, PilosaServerError from pilosa.exceptions import PilosaError from pilosa.orm import Index, TimeQuantum, Schema, CacheType +from pilosa.response import GroupCount, FieldRow from pilosa.imports import csv_column_reader, csv_field_value_reader, \ csv_column_id_value, csv_column_key_value, csv_row_key_column_id @@ -579,6 +580,38 @@ def test_range_field(self): self.assertEquals(1, len(response.results)) self.assertEquals(10, response.result.row.columns[0]) + def test_rows(self): + client = self.get_client() + index = self.index + field = index.field("rowsfield") + client.ensure_field(field) + client.query(index.batch_query( + field.set(1, 100), + field.set(1, 200), + field.set(2, 200), + )) + resp = client.query(field.rows()) + target = [1, 2] + self.assertEqual(target, resp.result.row_identifiers.ids) + + def test_group_by(self): + client = self.get_client() + index = self.index + field = index.field("groupbyfield") + client.ensure_field(field) + client.query(index.batch_query( + field.set(1, 100), + field.set(1, 200), + field.set(2, 200), + )) + resp = client.query(index.group_by(field.rows())) + target = [ + GroupCount([FieldRow("groupbyfield", 1)], 2), + GroupCount([FieldRow("groupbyfield", 2)], 1), + ] + self.assertEqual(target, resp.result.group_counts) + + def test_exclude_attrs_columns(self): client = self.get_client() client.query(self.col_index.batch_query( diff --git a/pilosa/imports.py b/pilosa/imports.py index 17290e1..2fd8478 100644 --- a/pilosa/imports.py +++ b/pilosa/imports.py @@ -80,8 +80,7 @@ def __init__(self, column_id=0, column_key="", value=0): self.value = value def __hash__(self): - return hash("%s:%s:%s" % \ - (self.column_id, self.column_key, self.value)) + return hash((self.column_id, self.column_key, self.value)) def __eq__(self, other): if id(self) == id(other): diff --git a/pilosa/internal/public.proto b/pilosa/internal/public.proto index c349a30..592874b 100644 --- a/pilosa/internal/public.proto +++ b/pilosa/internal/public.proto @@ -1,5 +1,7 @@ syntax = "proto3"; +package internal; + message Row { repeated uint64 Columns = 1; repeated string Keys = 3; @@ -17,12 +19,13 @@ message Pair { uint64 Count = 2; } -message FieldRow { +message FieldRow{ string Field = 1; uint64 RowID = 2; + string RowKey = 3; } -message GroupCount { +message GroupCount{ repeated FieldRow Group = 1; uint64 Count = 2; } @@ -32,12 +35,6 @@ message ValCount { int64 Count = 2; } -message Bit { - uint64 RowID = 1; - uint64 ColumnID = 2; - int64 Timestamp = 3; -} - message ColumnAttrSet { uint64 ID = 1; string Key = 3; @@ -78,7 +75,7 @@ message QueryResult { uint64 N = 2; repeated Pair Pairs = 3; bool Changed = 4; - ValCount ValCount = 5; + ValCount ValCount = 5; repeated uint64 RowIDs = 7; repeated GroupCount GroupCounts = 8; RowIdentifiers RowIdentifiers = 9; @@ -104,6 +101,16 @@ message ImportValueRequest { repeated int64 Values = 6; } +message TranslateKeysRequest { + string Index = 1; + string Field = 2; + repeated string Keys = 3; +} + +message TranslateKeysResponse { + repeated uint64 IDs = 3; +} + message ImportRoaringRequestView { string Name = 1; bytes Data = 2; diff --git a/pilosa/internal/public_pb2.py b/pilosa/internal/public_pb2.py index bc4e196..b29f342 100644 --- a/pilosa/internal/public_pb2.py +++ b/pilosa/internal/public_pb2.py @@ -16,10 +16,10 @@ DESCRIPTOR = _descriptor.FileDescriptor( name='public.proto', - package='', + package='internal', syntax='proto3', serialized_options=None, - serialized_pb=_b('\n\x0cpublic.proto\":\n\x03Row\x12\x0f\n\x07\x43olumns\x18\x01 \x03(\x04\x12\x0c\n\x04Keys\x18\x03 \x03(\t\x12\x14\n\x05\x41ttrs\x18\x02 \x03(\x0b\x32\x05.Attr\",\n\x0eRowIdentifiers\x12\x0c\n\x04Rows\x18\x01 \x03(\x04\x12\x0c\n\x04Keys\x18\x02 \x03(\t\".\n\x04Pair\x12\n\n\x02ID\x18\x01 \x01(\x04\x12\x0b\n\x03Key\x18\x03 \x01(\t\x12\r\n\x05\x43ount\x18\x02 \x01(\x04\"(\n\x08\x46ieldRow\x12\r\n\x05\x46ield\x18\x01 \x01(\t\x12\r\n\x05RowID\x18\x02 \x01(\x04\"5\n\nGroupCount\x12\x18\n\x05Group\x18\x01 \x03(\x0b\x32\t.FieldRow\x12\r\n\x05\x43ount\x18\x02 \x01(\x04\"&\n\x08ValCount\x12\x0b\n\x03Val\x18\x01 \x01(\x03\x12\r\n\x05\x43ount\x18\x02 \x01(\x03\"9\n\x03\x42it\x12\r\n\x05RowID\x18\x01 \x01(\x04\x12\x10\n\x08\x43olumnID\x18\x02 \x01(\x04\x12\x11\n\tTimestamp\x18\x03 \x01(\x03\">\n\rColumnAttrSet\x12\n\n\x02ID\x18\x01 \x01(\x04\x12\x0b\n\x03Key\x18\x03 \x01(\t\x12\x14\n\x05\x41ttrs\x18\x02 \x03(\x0b\x32\x05.Attr\"o\n\x04\x41ttr\x12\x0b\n\x03Key\x18\x01 \x01(\t\x12\x0c\n\x04Type\x18\x02 \x01(\x04\x12\x13\n\x0bStringValue\x18\x03 \x01(\t\x12\x10\n\x08IntValue\x18\x04 \x01(\x03\x12\x11\n\tBoolValue\x18\x05 \x01(\x08\x12\x12\n\nFloatValue\x18\x06 \x01(\x01\"\x1f\n\x07\x41ttrMap\x12\x14\n\x05\x41ttrs\x18\x01 \x03(\x0b\x32\x05.Attr\"\x83\x01\n\x0cQueryRequest\x12\r\n\x05Query\x18\x01 \x01(\t\x12\x0e\n\x06Shards\x18\x02 \x03(\x04\x12\x13\n\x0b\x43olumnAttrs\x18\x03 \x01(\x08\x12\x0e\n\x06Remote\x18\x05 \x01(\x08\x12\x17\n\x0f\x45xcludeRowAttrs\x18\x06 \x01(\x08\x12\x16\n\x0e\x45xcludeColumns\x18\x07 \x01(\x08\"c\n\rQueryResponse\x12\x0b\n\x03\x45rr\x18\x01 \x01(\t\x12\x1d\n\x07Results\x18\x02 \x03(\x0b\x32\x0c.QueryResult\x12&\n\x0e\x43olumnAttrSets\x18\x03 \x03(\x0b\x32\x0e.ColumnAttrSet\"\xd8\x01\n\x0bQueryResult\x12\x0c\n\x04Type\x18\x06 \x01(\r\x12\x11\n\x03Row\x18\x01 \x01(\x0b\x32\x04.Row\x12\t\n\x01N\x18\x02 \x01(\x04\x12\x14\n\x05Pairs\x18\x03 \x03(\x0b\x32\x05.Pair\x12\x0f\n\x07\x43hanged\x18\x04 \x01(\x08\x12\x1b\n\x08ValCount\x18\x05 \x01(\x0b\x32\t.ValCount\x12\x0e\n\x06RowIDs\x18\x07 \x03(\x04\x12 \n\x0bGroupCounts\x18\x08 \x03(\x0b\x32\x0b.GroupCount\x12\'\n\x0eRowIdentifiers\x18\t \x01(\x0b\x32\x0f.RowIdentifiers\"\x98\x01\n\rImportRequest\x12\r\n\x05Index\x18\x01 \x01(\t\x12\r\n\x05\x46ield\x18\x02 \x01(\t\x12\r\n\x05Shard\x18\x03 \x01(\x04\x12\x0e\n\x06RowIDs\x18\x04 \x03(\x04\x12\x11\n\tColumnIDs\x18\x05 \x03(\x04\x12\x0f\n\x07RowKeys\x18\x07 \x03(\t\x12\x12\n\nColumnKeys\x18\x08 \x03(\t\x12\x12\n\nTimestamps\x18\x06 \x03(\x03\"x\n\x12ImportValueRequest\x12\r\n\x05Index\x18\x01 \x01(\t\x12\r\n\x05\x46ield\x18\x02 \x01(\t\x12\r\n\x05Shard\x18\x03 \x01(\x04\x12\x11\n\tColumnIDs\x18\x05 \x03(\x04\x12\x12\n\nColumnKeys\x18\x07 \x03(\t\x12\x0e\n\x06Values\x18\x06 \x03(\x03\"6\n\x18ImportRoaringRequestView\x12\x0c\n\x04Name\x18\x01 \x01(\t\x12\x0c\n\x04\x44\x61ta\x18\x02 \x01(\x0c\"O\n\x14ImportRoaringRequest\x12\r\n\x05\x43lear\x18\x01 \x01(\x08\x12(\n\x05views\x18\x02 \x03(\x0b\x32\x19.ImportRoaringRequestViewb\x06proto3') + serialized_pb=_b('\n\x0cpublic.proto\x12\x08internal\"C\n\x03Row\x12\x0f\n\x07\x43olumns\x18\x01 \x03(\x04\x12\x0c\n\x04Keys\x18\x03 \x03(\t\x12\x1d\n\x05\x41ttrs\x18\x02 \x03(\x0b\x32\x0e.internal.Attr\",\n\x0eRowIdentifiers\x12\x0c\n\x04Rows\x18\x01 \x03(\x04\x12\x0c\n\x04Keys\x18\x02 \x03(\t\".\n\x04Pair\x12\n\n\x02ID\x18\x01 \x01(\x04\x12\x0b\n\x03Key\x18\x03 \x01(\t\x12\r\n\x05\x43ount\x18\x02 \x01(\x04\"8\n\x08\x46ieldRow\x12\r\n\x05\x46ield\x18\x01 \x01(\t\x12\r\n\x05RowID\x18\x02 \x01(\x04\x12\x0e\n\x06RowKey\x18\x03 \x01(\t\">\n\nGroupCount\x12!\n\x05Group\x18\x01 \x03(\x0b\x32\x12.internal.FieldRow\x12\r\n\x05\x43ount\x18\x02 \x01(\x04\"&\n\x08ValCount\x12\x0b\n\x03Val\x18\x01 \x01(\x03\x12\r\n\x05\x43ount\x18\x02 \x01(\x03\"G\n\rColumnAttrSet\x12\n\n\x02ID\x18\x01 \x01(\x04\x12\x0b\n\x03Key\x18\x03 \x01(\t\x12\x1d\n\x05\x41ttrs\x18\x02 \x03(\x0b\x32\x0e.internal.Attr\"o\n\x04\x41ttr\x12\x0b\n\x03Key\x18\x01 \x01(\t\x12\x0c\n\x04Type\x18\x02 \x01(\x04\x12\x13\n\x0bStringValue\x18\x03 \x01(\t\x12\x10\n\x08IntValue\x18\x04 \x01(\x03\x12\x11\n\tBoolValue\x18\x05 \x01(\x08\x12\x12\n\nFloatValue\x18\x06 \x01(\x01\"(\n\x07\x41ttrMap\x12\x1d\n\x05\x41ttrs\x18\x01 \x03(\x0b\x32\x0e.internal.Attr\"\x83\x01\n\x0cQueryRequest\x12\r\n\x05Query\x18\x01 \x01(\t\x12\x0e\n\x06Shards\x18\x02 \x03(\x04\x12\x13\n\x0b\x43olumnAttrs\x18\x03 \x01(\x08\x12\x0e\n\x06Remote\x18\x05 \x01(\x08\x12\x17\n\x0f\x45xcludeRowAttrs\x18\x06 \x01(\x08\x12\x16\n\x0e\x45xcludeColumns\x18\x07 \x01(\x08\"u\n\rQueryResponse\x12\x0b\n\x03\x45rr\x18\x01 \x01(\t\x12&\n\x07Results\x18\x02 \x03(\x0b\x32\x15.internal.QueryResult\x12/\n\x0e\x43olumnAttrSets\x18\x03 \x03(\x0b\x32\x17.internal.ColumnAttrSet\"\x85\x02\n\x0bQueryResult\x12\x0c\n\x04Type\x18\x06 \x01(\r\x12\x1a\n\x03Row\x18\x01 \x01(\x0b\x32\r.internal.Row\x12\t\n\x01N\x18\x02 \x01(\x04\x12\x1d\n\x05Pairs\x18\x03 \x03(\x0b\x32\x0e.internal.Pair\x12\x0f\n\x07\x43hanged\x18\x04 \x01(\x08\x12$\n\x08ValCount\x18\x05 \x01(\x0b\x32\x12.internal.ValCount\x12\x0e\n\x06RowIDs\x18\x07 \x03(\x04\x12)\n\x0bGroupCounts\x18\x08 \x03(\x0b\x32\x14.internal.GroupCount\x12\x30\n\x0eRowIdentifiers\x18\t \x01(\x0b\x32\x18.internal.RowIdentifiers\"\x98\x01\n\rImportRequest\x12\r\n\x05Index\x18\x01 \x01(\t\x12\r\n\x05\x46ield\x18\x02 \x01(\t\x12\r\n\x05Shard\x18\x03 \x01(\x04\x12\x0e\n\x06RowIDs\x18\x04 \x03(\x04\x12\x11\n\tColumnIDs\x18\x05 \x03(\x04\x12\x0f\n\x07RowKeys\x18\x07 \x03(\t\x12\x12\n\nColumnKeys\x18\x08 \x03(\t\x12\x12\n\nTimestamps\x18\x06 \x03(\x03\"x\n\x12ImportValueRequest\x12\r\n\x05Index\x18\x01 \x01(\t\x12\r\n\x05\x46ield\x18\x02 \x01(\t\x12\r\n\x05Shard\x18\x03 \x01(\x04\x12\x11\n\tColumnIDs\x18\x05 \x03(\x04\x12\x12\n\nColumnKeys\x18\x07 \x03(\t\x12\x0e\n\x06Values\x18\x06 \x03(\x03\"B\n\x14TranslateKeysRequest\x12\r\n\x05Index\x18\x01 \x01(\t\x12\r\n\x05\x46ield\x18\x02 \x01(\t\x12\x0c\n\x04Keys\x18\x03 \x03(\t\"$\n\x15TranslateKeysResponse\x12\x0b\n\x03IDs\x18\x03 \x03(\x04\"6\n\x18ImportRoaringRequestView\x12\x0c\n\x04Name\x18\x01 \x01(\t\x12\x0c\n\x04\x44\x61ta\x18\x02 \x01(\x0c\"X\n\x14ImportRoaringRequest\x12\r\n\x05\x43lear\x18\x01 \x01(\x08\x12\x31\n\x05views\x18\x02 \x03(\x0b\x32\".internal.ImportRoaringRequestViewb\x06proto3') ) @@ -27,27 +27,27 @@ _ROW = _descriptor.Descriptor( name='Row', - full_name='Row', + full_name='internal.Row', filename=None, file=DESCRIPTOR, containing_type=None, fields=[ _descriptor.FieldDescriptor( - name='Columns', full_name='Row.Columns', index=0, + name='Columns', full_name='internal.Row.Columns', index=0, number=1, type=4, cpp_type=4, label=3, has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='Keys', full_name='Row.Keys', index=1, + name='Keys', full_name='internal.Row.Keys', index=1, number=3, type=9, cpp_type=9, label=3, has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='Attrs', full_name='Row.Attrs', index=2, + name='Attrs', full_name='internal.Row.Attrs', index=2, number=2, type=11, cpp_type=10, label=3, has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, @@ -65,27 +65,27 @@ extension_ranges=[], oneofs=[ ], - serialized_start=16, - serialized_end=74, + serialized_start=26, + serialized_end=93, ) _ROWIDENTIFIERS = _descriptor.Descriptor( name='RowIdentifiers', - full_name='RowIdentifiers', + full_name='internal.RowIdentifiers', filename=None, file=DESCRIPTOR, containing_type=None, fields=[ _descriptor.FieldDescriptor( - name='Rows', full_name='RowIdentifiers.Rows', index=0, + name='Rows', full_name='internal.RowIdentifiers.Rows', index=0, number=1, type=4, cpp_type=4, label=3, has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='Keys', full_name='RowIdentifiers.Keys', index=1, + name='Keys', full_name='internal.RowIdentifiers.Keys', index=1, number=2, type=9, cpp_type=9, label=3, has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, @@ -103,34 +103,34 @@ extension_ranges=[], oneofs=[ ], - serialized_start=76, - serialized_end=120, + serialized_start=95, + serialized_end=139, ) _PAIR = _descriptor.Descriptor( name='Pair', - full_name='Pair', + full_name='internal.Pair', filename=None, file=DESCRIPTOR, containing_type=None, fields=[ _descriptor.FieldDescriptor( - name='ID', full_name='Pair.ID', index=0, + name='ID', full_name='internal.Pair.ID', index=0, number=1, type=4, cpp_type=4, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='Key', full_name='Pair.Key', index=1, + name='Key', full_name='internal.Pair.Key', index=1, number=3, type=9, cpp_type=9, label=1, has_default_value=False, default_value=_b("").decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='Count', full_name='Pair.Count', index=2, + name='Count', full_name='internal.Pair.Count', index=2, number=2, type=4, cpp_type=4, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, @@ -148,32 +148,39 @@ extension_ranges=[], oneofs=[ ], - serialized_start=122, - serialized_end=168, + serialized_start=141, + serialized_end=187, ) _FIELDROW = _descriptor.Descriptor( name='FieldRow', - full_name='FieldRow', + full_name='internal.FieldRow', filename=None, file=DESCRIPTOR, containing_type=None, fields=[ _descriptor.FieldDescriptor( - name='Field', full_name='FieldRow.Field', index=0, + name='Field', full_name='internal.FieldRow.Field', index=0, number=1, type=9, cpp_type=9, label=1, has_default_value=False, default_value=_b("").decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='RowID', full_name='FieldRow.RowID', index=1, + name='RowID', full_name='internal.FieldRow.RowID', index=1, number=2, type=4, cpp_type=4, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='RowKey', full_name='internal.FieldRow.RowKey', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), ], extensions=[ ], @@ -186,27 +193,27 @@ extension_ranges=[], oneofs=[ ], - serialized_start=170, - serialized_end=210, + serialized_start=189, + serialized_end=245, ) _GROUPCOUNT = _descriptor.Descriptor( name='GroupCount', - full_name='GroupCount', + full_name='internal.GroupCount', filename=None, file=DESCRIPTOR, containing_type=None, fields=[ _descriptor.FieldDescriptor( - name='Group', full_name='GroupCount.Group', index=0, + name='Group', full_name='internal.GroupCount.Group', index=0, number=1, type=11, cpp_type=10, label=3, has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='Count', full_name='GroupCount.Count', index=1, + name='Count', full_name='internal.GroupCount.Count', index=1, number=2, type=4, cpp_type=4, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, @@ -224,27 +231,27 @@ extension_ranges=[], oneofs=[ ], - serialized_start=212, - serialized_end=265, + serialized_start=247, + serialized_end=309, ) _VALCOUNT = _descriptor.Descriptor( name='ValCount', - full_name='ValCount', + full_name='internal.ValCount', filename=None, file=DESCRIPTOR, containing_type=None, fields=[ _descriptor.FieldDescriptor( - name='Val', full_name='ValCount.Val', index=0, + name='Val', full_name='internal.ValCount.Val', index=0, number=1, type=3, cpp_type=2, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='Count', full_name='ValCount.Count', index=1, + name='Count', full_name='internal.ValCount.Count', index=1, number=2, type=3, cpp_type=2, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, @@ -262,79 +269,34 @@ extension_ranges=[], oneofs=[ ], - serialized_start=267, - serialized_end=305, -) - - -_BIT = _descriptor.Descriptor( - name='Bit', - full_name='Bit', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='RowID', full_name='Bit.RowID', index=0, - number=1, type=4, cpp_type=4, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='ColumnID', full_name='Bit.ColumnID', index=1, - number=2, type=4, cpp_type=4, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - _descriptor.FieldDescriptor( - name='Timestamp', full_name='Bit.Timestamp', index=2, - number=3, type=3, cpp_type=2, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=307, - serialized_end=364, + serialized_start=311, + serialized_end=349, ) _COLUMNATTRSET = _descriptor.Descriptor( name='ColumnAttrSet', - full_name='ColumnAttrSet', + full_name='internal.ColumnAttrSet', filename=None, file=DESCRIPTOR, containing_type=None, fields=[ _descriptor.FieldDescriptor( - name='ID', full_name='ColumnAttrSet.ID', index=0, + name='ID', full_name='internal.ColumnAttrSet.ID', index=0, number=1, type=4, cpp_type=4, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='Key', full_name='ColumnAttrSet.Key', index=1, + name='Key', full_name='internal.ColumnAttrSet.Key', index=1, number=3, type=9, cpp_type=9, label=1, has_default_value=False, default_value=_b("").decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='Attrs', full_name='ColumnAttrSet.Attrs', index=2, + name='Attrs', full_name='internal.ColumnAttrSet.Attrs', index=2, number=2, type=11, cpp_type=10, label=3, has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, @@ -352,55 +314,55 @@ extension_ranges=[], oneofs=[ ], - serialized_start=366, - serialized_end=428, + serialized_start=351, + serialized_end=422, ) _ATTR = _descriptor.Descriptor( name='Attr', - full_name='Attr', + full_name='internal.Attr', filename=None, file=DESCRIPTOR, containing_type=None, fields=[ _descriptor.FieldDescriptor( - name='Key', full_name='Attr.Key', index=0, + name='Key', full_name='internal.Attr.Key', index=0, number=1, type=9, cpp_type=9, label=1, has_default_value=False, default_value=_b("").decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='Type', full_name='Attr.Type', index=1, + name='Type', full_name='internal.Attr.Type', index=1, number=2, type=4, cpp_type=4, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='StringValue', full_name='Attr.StringValue', index=2, + name='StringValue', full_name='internal.Attr.StringValue', index=2, number=3, type=9, cpp_type=9, label=1, has_default_value=False, default_value=_b("").decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='IntValue', full_name='Attr.IntValue', index=3, + name='IntValue', full_name='internal.Attr.IntValue', index=3, number=4, type=3, cpp_type=2, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='BoolValue', full_name='Attr.BoolValue', index=4, + name='BoolValue', full_name='internal.Attr.BoolValue', index=4, number=5, type=8, cpp_type=7, label=1, has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='FloatValue', full_name='Attr.FloatValue', index=5, + name='FloatValue', full_name='internal.Attr.FloatValue', index=5, number=6, type=1, cpp_type=5, label=1, has_default_value=False, default_value=float(0), message_type=None, enum_type=None, containing_type=None, @@ -418,20 +380,20 @@ extension_ranges=[], oneofs=[ ], - serialized_start=430, - serialized_end=541, + serialized_start=424, + serialized_end=535, ) _ATTRMAP = _descriptor.Descriptor( name='AttrMap', - full_name='AttrMap', + full_name='internal.AttrMap', filename=None, file=DESCRIPTOR, containing_type=None, fields=[ _descriptor.FieldDescriptor( - name='Attrs', full_name='AttrMap.Attrs', index=0, + name='Attrs', full_name='internal.AttrMap.Attrs', index=0, number=1, type=11, cpp_type=10, label=3, has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, @@ -449,55 +411,55 @@ extension_ranges=[], oneofs=[ ], - serialized_start=543, - serialized_end=574, + serialized_start=537, + serialized_end=577, ) _QUERYREQUEST = _descriptor.Descriptor( name='QueryRequest', - full_name='QueryRequest', + full_name='internal.QueryRequest', filename=None, file=DESCRIPTOR, containing_type=None, fields=[ _descriptor.FieldDescriptor( - name='Query', full_name='QueryRequest.Query', index=0, + name='Query', full_name='internal.QueryRequest.Query', index=0, number=1, type=9, cpp_type=9, label=1, has_default_value=False, default_value=_b("").decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='Shards', full_name='QueryRequest.Shards', index=1, + name='Shards', full_name='internal.QueryRequest.Shards', index=1, number=2, type=4, cpp_type=4, label=3, has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='ColumnAttrs', full_name='QueryRequest.ColumnAttrs', index=2, + name='ColumnAttrs', full_name='internal.QueryRequest.ColumnAttrs', index=2, number=3, type=8, cpp_type=7, label=1, has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='Remote', full_name='QueryRequest.Remote', index=3, + name='Remote', full_name='internal.QueryRequest.Remote', index=3, number=5, type=8, cpp_type=7, label=1, has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='ExcludeRowAttrs', full_name='QueryRequest.ExcludeRowAttrs', index=4, + name='ExcludeRowAttrs', full_name='internal.QueryRequest.ExcludeRowAttrs', index=4, number=6, type=8, cpp_type=7, label=1, has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='ExcludeColumns', full_name='QueryRequest.ExcludeColumns', index=5, + name='ExcludeColumns', full_name='internal.QueryRequest.ExcludeColumns', index=5, number=7, type=8, cpp_type=7, label=1, has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, @@ -515,34 +477,34 @@ extension_ranges=[], oneofs=[ ], - serialized_start=577, - serialized_end=708, + serialized_start=580, + serialized_end=711, ) _QUERYRESPONSE = _descriptor.Descriptor( name='QueryResponse', - full_name='QueryResponse', + full_name='internal.QueryResponse', filename=None, file=DESCRIPTOR, containing_type=None, fields=[ _descriptor.FieldDescriptor( - name='Err', full_name='QueryResponse.Err', index=0, + name='Err', full_name='internal.QueryResponse.Err', index=0, number=1, type=9, cpp_type=9, label=1, has_default_value=False, default_value=_b("").decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='Results', full_name='QueryResponse.Results', index=1, + name='Results', full_name='internal.QueryResponse.Results', index=1, number=2, type=11, cpp_type=10, label=3, has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='ColumnAttrSets', full_name='QueryResponse.ColumnAttrSets', index=2, + name='ColumnAttrSets', full_name='internal.QueryResponse.ColumnAttrSets', index=2, number=3, type=11, cpp_type=10, label=3, has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, @@ -560,76 +522,76 @@ extension_ranges=[], oneofs=[ ], - serialized_start=710, - serialized_end=809, + serialized_start=713, + serialized_end=830, ) _QUERYRESULT = _descriptor.Descriptor( name='QueryResult', - full_name='QueryResult', + full_name='internal.QueryResult', filename=None, file=DESCRIPTOR, containing_type=None, fields=[ _descriptor.FieldDescriptor( - name='Type', full_name='QueryResult.Type', index=0, + name='Type', full_name='internal.QueryResult.Type', index=0, number=6, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='Row', full_name='QueryResult.Row', index=1, + name='Row', full_name='internal.QueryResult.Row', index=1, number=1, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='N', full_name='QueryResult.N', index=2, + name='N', full_name='internal.QueryResult.N', index=2, number=2, type=4, cpp_type=4, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='Pairs', full_name='QueryResult.Pairs', index=3, + name='Pairs', full_name='internal.QueryResult.Pairs', index=3, number=3, type=11, cpp_type=10, label=3, has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='Changed', full_name='QueryResult.Changed', index=4, + name='Changed', full_name='internal.QueryResult.Changed', index=4, number=4, type=8, cpp_type=7, label=1, has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='ValCount', full_name='QueryResult.ValCount', index=5, + name='ValCount', full_name='internal.QueryResult.ValCount', index=5, number=5, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='RowIDs', full_name='QueryResult.RowIDs', index=6, + name='RowIDs', full_name='internal.QueryResult.RowIDs', index=6, number=7, type=4, cpp_type=4, label=3, has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='GroupCounts', full_name='QueryResult.GroupCounts', index=7, + name='GroupCounts', full_name='internal.QueryResult.GroupCounts', index=7, number=8, type=11, cpp_type=10, label=3, has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='RowIdentifiers', full_name='QueryResult.RowIdentifiers', index=8, + name='RowIdentifiers', full_name='internal.QueryResult.RowIdentifiers', index=8, number=9, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, @@ -647,69 +609,69 @@ extension_ranges=[], oneofs=[ ], - serialized_start=812, - serialized_end=1028, + serialized_start=833, + serialized_end=1094, ) _IMPORTREQUEST = _descriptor.Descriptor( name='ImportRequest', - full_name='ImportRequest', + full_name='internal.ImportRequest', filename=None, file=DESCRIPTOR, containing_type=None, fields=[ _descriptor.FieldDescriptor( - name='Index', full_name='ImportRequest.Index', index=0, + name='Index', full_name='internal.ImportRequest.Index', index=0, number=1, type=9, cpp_type=9, label=1, has_default_value=False, default_value=_b("").decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='Field', full_name='ImportRequest.Field', index=1, + name='Field', full_name='internal.ImportRequest.Field', index=1, number=2, type=9, cpp_type=9, label=1, has_default_value=False, default_value=_b("").decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='Shard', full_name='ImportRequest.Shard', index=2, + name='Shard', full_name='internal.ImportRequest.Shard', index=2, number=3, type=4, cpp_type=4, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='RowIDs', full_name='ImportRequest.RowIDs', index=3, + name='RowIDs', full_name='internal.ImportRequest.RowIDs', index=3, number=4, type=4, cpp_type=4, label=3, has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='ColumnIDs', full_name='ImportRequest.ColumnIDs', index=4, + name='ColumnIDs', full_name='internal.ImportRequest.ColumnIDs', index=4, number=5, type=4, cpp_type=4, label=3, has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='RowKeys', full_name='ImportRequest.RowKeys', index=5, + name='RowKeys', full_name='internal.ImportRequest.RowKeys', index=5, number=7, type=9, cpp_type=9, label=3, has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='ColumnKeys', full_name='ImportRequest.ColumnKeys', index=6, + name='ColumnKeys', full_name='internal.ImportRequest.ColumnKeys', index=6, number=8, type=9, cpp_type=9, label=3, has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='Timestamps', full_name='ImportRequest.Timestamps', index=7, + name='Timestamps', full_name='internal.ImportRequest.Timestamps', index=7, number=6, type=3, cpp_type=2, label=3, has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, @@ -727,55 +689,55 @@ extension_ranges=[], oneofs=[ ], - serialized_start=1031, - serialized_end=1183, + serialized_start=1097, + serialized_end=1249, ) _IMPORTVALUEREQUEST = _descriptor.Descriptor( name='ImportValueRequest', - full_name='ImportValueRequest', + full_name='internal.ImportValueRequest', filename=None, file=DESCRIPTOR, containing_type=None, fields=[ _descriptor.FieldDescriptor( - name='Index', full_name='ImportValueRequest.Index', index=0, + name='Index', full_name='internal.ImportValueRequest.Index', index=0, number=1, type=9, cpp_type=9, label=1, has_default_value=False, default_value=_b("").decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='Field', full_name='ImportValueRequest.Field', index=1, + name='Field', full_name='internal.ImportValueRequest.Field', index=1, number=2, type=9, cpp_type=9, label=1, has_default_value=False, default_value=_b("").decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='Shard', full_name='ImportValueRequest.Shard', index=2, + name='Shard', full_name='internal.ImportValueRequest.Shard', index=2, number=3, type=4, cpp_type=4, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='ColumnIDs', full_name='ImportValueRequest.ColumnIDs', index=3, + name='ColumnIDs', full_name='internal.ImportValueRequest.ColumnIDs', index=3, number=5, type=4, cpp_type=4, label=3, has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='ColumnKeys', full_name='ImportValueRequest.ColumnKeys', index=4, + name='ColumnKeys', full_name='internal.ImportValueRequest.ColumnKeys', index=4, number=7, type=9, cpp_type=9, label=3, has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='Values', full_name='ImportValueRequest.Values', index=5, + name='Values', full_name='internal.ImportValueRequest.Values', index=5, number=6, type=3, cpp_type=2, label=3, has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, @@ -793,27 +755,103 @@ extension_ranges=[], oneofs=[ ], - serialized_start=1185, - serialized_end=1305, + serialized_start=1251, + serialized_end=1371, +) + + +_TRANSLATEKEYSREQUEST = _descriptor.Descriptor( + name='TranslateKeysRequest', + full_name='internal.TranslateKeysRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Index', full_name='internal.TranslateKeysRequest.Index', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='Field', full_name='internal.TranslateKeysRequest.Field', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='Keys', full_name='internal.TranslateKeysRequest.Keys', index=2, + number=3, type=9, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1373, + serialized_end=1439, +) + + +_TRANSLATEKEYSRESPONSE = _descriptor.Descriptor( + name='TranslateKeysResponse', + full_name='internal.TranslateKeysResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='IDs', full_name='internal.TranslateKeysResponse.IDs', index=0, + number=3, type=4, cpp_type=4, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1441, + serialized_end=1477, ) _IMPORTROARINGREQUESTVIEW = _descriptor.Descriptor( name='ImportRoaringRequestView', - full_name='ImportRoaringRequestView', + full_name='internal.ImportRoaringRequestView', filename=None, file=DESCRIPTOR, containing_type=None, fields=[ _descriptor.FieldDescriptor( - name='Name', full_name='ImportRoaringRequestView.Name', index=0, + name='Name', full_name='internal.ImportRoaringRequestView.Name', index=0, number=1, type=9, cpp_type=9, label=1, has_default_value=False, default_value=_b("").decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='Data', full_name='ImportRoaringRequestView.Data', index=1, + name='Data', full_name='internal.ImportRoaringRequestView.Data', index=1, number=2, type=12, cpp_type=9, label=1, has_default_value=False, default_value=_b(""), message_type=None, enum_type=None, containing_type=None, @@ -831,27 +869,27 @@ extension_ranges=[], oneofs=[ ], - serialized_start=1307, - serialized_end=1361, + serialized_start=1479, + serialized_end=1533, ) _IMPORTROARINGREQUEST = _descriptor.Descriptor( name='ImportRoaringRequest', - full_name='ImportRoaringRequest', + full_name='internal.ImportRoaringRequest', filename=None, file=DESCRIPTOR, containing_type=None, fields=[ _descriptor.FieldDescriptor( - name='Clear', full_name='ImportRoaringRequest.Clear', index=0, + name='Clear', full_name='internal.ImportRoaringRequest.Clear', index=0, number=1, type=8, cpp_type=7, label=1, has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR), _descriptor.FieldDescriptor( - name='views', full_name='ImportRoaringRequest.views', index=1, + name='views', full_name='internal.ImportRoaringRequest.views', index=1, number=2, type=11, cpp_type=10, label=3, has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, @@ -869,8 +907,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=1363, - serialized_end=1442, + serialized_start=1535, + serialized_end=1623, ) _ROW.fields_by_name['Attrs'].message_type = _ATTR @@ -891,7 +929,6 @@ DESCRIPTOR.message_types_by_name['FieldRow'] = _FIELDROW DESCRIPTOR.message_types_by_name['GroupCount'] = _GROUPCOUNT DESCRIPTOR.message_types_by_name['ValCount'] = _VALCOUNT -DESCRIPTOR.message_types_by_name['Bit'] = _BIT DESCRIPTOR.message_types_by_name['ColumnAttrSet'] = _COLUMNATTRSET DESCRIPTOR.message_types_by_name['Attr'] = _ATTR DESCRIPTOR.message_types_by_name['AttrMap'] = _ATTRMAP @@ -900,6 +937,8 @@ DESCRIPTOR.message_types_by_name['QueryResult'] = _QUERYRESULT DESCRIPTOR.message_types_by_name['ImportRequest'] = _IMPORTREQUEST DESCRIPTOR.message_types_by_name['ImportValueRequest'] = _IMPORTVALUEREQUEST +DESCRIPTOR.message_types_by_name['TranslateKeysRequest'] = _TRANSLATEKEYSREQUEST +DESCRIPTOR.message_types_by_name['TranslateKeysResponse'] = _TRANSLATEKEYSRESPONSE DESCRIPTOR.message_types_by_name['ImportRoaringRequestView'] = _IMPORTROARINGREQUESTVIEW DESCRIPTOR.message_types_by_name['ImportRoaringRequest'] = _IMPORTROARINGREQUEST _sym_db.RegisterFileDescriptor(DESCRIPTOR) @@ -907,119 +946,126 @@ Row = _reflection.GeneratedProtocolMessageType('Row', (_message.Message,), dict( DESCRIPTOR = _ROW, __module__ = 'public_pb2' - # @@protoc_insertion_point(class_scope:Row) + # @@protoc_insertion_point(class_scope:internal.Row) )) _sym_db.RegisterMessage(Row) RowIdentifiers = _reflection.GeneratedProtocolMessageType('RowIdentifiers', (_message.Message,), dict( DESCRIPTOR = _ROWIDENTIFIERS, __module__ = 'public_pb2' - # @@protoc_insertion_point(class_scope:RowIdentifiers) + # @@protoc_insertion_point(class_scope:internal.RowIdentifiers) )) _sym_db.RegisterMessage(RowIdentifiers) Pair = _reflection.GeneratedProtocolMessageType('Pair', (_message.Message,), dict( DESCRIPTOR = _PAIR, __module__ = 'public_pb2' - # @@protoc_insertion_point(class_scope:Pair) + # @@protoc_insertion_point(class_scope:internal.Pair) )) _sym_db.RegisterMessage(Pair) FieldRow = _reflection.GeneratedProtocolMessageType('FieldRow', (_message.Message,), dict( DESCRIPTOR = _FIELDROW, __module__ = 'public_pb2' - # @@protoc_insertion_point(class_scope:FieldRow) + # @@protoc_insertion_point(class_scope:internal.FieldRow) )) _sym_db.RegisterMessage(FieldRow) GroupCount = _reflection.GeneratedProtocolMessageType('GroupCount', (_message.Message,), dict( DESCRIPTOR = _GROUPCOUNT, __module__ = 'public_pb2' - # @@protoc_insertion_point(class_scope:GroupCount) + # @@protoc_insertion_point(class_scope:internal.GroupCount) )) _sym_db.RegisterMessage(GroupCount) ValCount = _reflection.GeneratedProtocolMessageType('ValCount', (_message.Message,), dict( DESCRIPTOR = _VALCOUNT, __module__ = 'public_pb2' - # @@protoc_insertion_point(class_scope:ValCount) + # @@protoc_insertion_point(class_scope:internal.ValCount) )) _sym_db.RegisterMessage(ValCount) -Bit = _reflection.GeneratedProtocolMessageType('Bit', (_message.Message,), dict( - DESCRIPTOR = _BIT, - __module__ = 'public_pb2' - # @@protoc_insertion_point(class_scope:Bit) - )) -_sym_db.RegisterMessage(Bit) - ColumnAttrSet = _reflection.GeneratedProtocolMessageType('ColumnAttrSet', (_message.Message,), dict( DESCRIPTOR = _COLUMNATTRSET, __module__ = 'public_pb2' - # @@protoc_insertion_point(class_scope:ColumnAttrSet) + # @@protoc_insertion_point(class_scope:internal.ColumnAttrSet) )) _sym_db.RegisterMessage(ColumnAttrSet) Attr = _reflection.GeneratedProtocolMessageType('Attr', (_message.Message,), dict( DESCRIPTOR = _ATTR, __module__ = 'public_pb2' - # @@protoc_insertion_point(class_scope:Attr) + # @@protoc_insertion_point(class_scope:internal.Attr) )) _sym_db.RegisterMessage(Attr) AttrMap = _reflection.GeneratedProtocolMessageType('AttrMap', (_message.Message,), dict( DESCRIPTOR = _ATTRMAP, __module__ = 'public_pb2' - # @@protoc_insertion_point(class_scope:AttrMap) + # @@protoc_insertion_point(class_scope:internal.AttrMap) )) _sym_db.RegisterMessage(AttrMap) QueryRequest = _reflection.GeneratedProtocolMessageType('QueryRequest', (_message.Message,), dict( DESCRIPTOR = _QUERYREQUEST, __module__ = 'public_pb2' - # @@protoc_insertion_point(class_scope:QueryRequest) + # @@protoc_insertion_point(class_scope:internal.QueryRequest) )) _sym_db.RegisterMessage(QueryRequest) QueryResponse = _reflection.GeneratedProtocolMessageType('QueryResponse', (_message.Message,), dict( DESCRIPTOR = _QUERYRESPONSE, __module__ = 'public_pb2' - # @@protoc_insertion_point(class_scope:QueryResponse) + # @@protoc_insertion_point(class_scope:internal.QueryResponse) )) _sym_db.RegisterMessage(QueryResponse) QueryResult = _reflection.GeneratedProtocolMessageType('QueryResult', (_message.Message,), dict( DESCRIPTOR = _QUERYRESULT, __module__ = 'public_pb2' - # @@protoc_insertion_point(class_scope:QueryResult) + # @@protoc_insertion_point(class_scope:internal.QueryResult) )) _sym_db.RegisterMessage(QueryResult) ImportRequest = _reflection.GeneratedProtocolMessageType('ImportRequest', (_message.Message,), dict( DESCRIPTOR = _IMPORTREQUEST, __module__ = 'public_pb2' - # @@protoc_insertion_point(class_scope:ImportRequest) + # @@protoc_insertion_point(class_scope:internal.ImportRequest) )) _sym_db.RegisterMessage(ImportRequest) ImportValueRequest = _reflection.GeneratedProtocolMessageType('ImportValueRequest', (_message.Message,), dict( DESCRIPTOR = _IMPORTVALUEREQUEST, __module__ = 'public_pb2' - # @@protoc_insertion_point(class_scope:ImportValueRequest) + # @@protoc_insertion_point(class_scope:internal.ImportValueRequest) )) _sym_db.RegisterMessage(ImportValueRequest) +TranslateKeysRequest = _reflection.GeneratedProtocolMessageType('TranslateKeysRequest', (_message.Message,), dict( + DESCRIPTOR = _TRANSLATEKEYSREQUEST, + __module__ = 'public_pb2' + # @@protoc_insertion_point(class_scope:internal.TranslateKeysRequest) + )) +_sym_db.RegisterMessage(TranslateKeysRequest) + +TranslateKeysResponse = _reflection.GeneratedProtocolMessageType('TranslateKeysResponse', (_message.Message,), dict( + DESCRIPTOR = _TRANSLATEKEYSRESPONSE, + __module__ = 'public_pb2' + # @@protoc_insertion_point(class_scope:internal.TranslateKeysResponse) + )) +_sym_db.RegisterMessage(TranslateKeysResponse) + ImportRoaringRequestView = _reflection.GeneratedProtocolMessageType('ImportRoaringRequestView', (_message.Message,), dict( DESCRIPTOR = _IMPORTROARINGREQUESTVIEW, __module__ = 'public_pb2' - # @@protoc_insertion_point(class_scope:ImportRoaringRequestView) + # @@protoc_insertion_point(class_scope:internal.ImportRoaringRequestView) )) _sym_db.RegisterMessage(ImportRoaringRequestView) ImportRoaringRequest = _reflection.GeneratedProtocolMessageType('ImportRoaringRequest', (_message.Message,), dict( DESCRIPTOR = _IMPORTROARINGREQUEST, __module__ = 'public_pb2' - # @@protoc_insertion_point(class_scope:ImportRoaringRequest) + # @@protoc_insertion_point(class_scope:internal.ImportRoaringRequest) )) _sym_db.RegisterMessage(ImportRoaringRequest) diff --git a/pilosa/orm.py b/pilosa/orm.py index 602be92..2f1b597 100644 --- a/pilosa/orm.py +++ b/pilosa/orm.py @@ -412,7 +412,30 @@ def options(self, row_query, column_attrs=False, exclude_columns=False, exclude_ (make_bool(column_attrs), make_bool(exclude_columns), make_bool(exclude_row_attrs)) if shards: serialized_options = "%s,shards=[%s]" % (serialized_options, ",".join(str(s) for s in shards)) - return PQLQuery("Options(%s,%s)" % (row_query.serialize().query, serialized_options), self.name) + return PQLQuery("Options(%s,%s)" % (row_query.serialize().query, serialized_options), self) + + def group_by(self, *rows_queries, **kwargs): + """Creates a ``GroupBy`` query. + + :param *PQLQuery rows_queries: List of at least one ``Rows`` queries. + :param int limit: (Optional) limits the number of results returned. + :param PQLQuery filter: (Optional) takes any type of `Row` query (e.g. Row, Union, + Intersect, etc.) which will be intersected with each result prior to returning + the count. This is analagous to a WHERE clause applied to a relational GROUP BY + query. + :return: Pilosa query + :rtype: pilosa.PQLQuery + """ + if len(rows_queries) < 1: + raise PilosaError("Number of rows queries should be greater than or equal to 1") + q = [u",".join(q.serialize().query for q in rows_queries)] + limit = kwargs.get("limit") + if limit is not None: + q.append("limit=%s" % limit) + filter = kwargs.get("filter") + if filter is not None: + q.append("filter=%s" % filter.serialize().query) + return PQLQuery(u"GroupBy(%s)" % u",".join(q), self) def _row_op(self, name, rows): return PQLQuery(u"%s(%s)" % (name, u", ".join(b.serialize().query for b in rows)), self) @@ -779,6 +802,28 @@ def setvalue(self, col, value): q = u"Set(%s,%s=%d)" % (col_str, self.name, value) return PQLQuery(q, self.index) + def rows(self, prev_row=None, limit=0, column=None): + """Creates a ``Rows`` query. + + :param *PQLQuery prev_row: (Optional) If given, rows prior to and including the specified row ID or +key will not be returned. + :param int limit: (Optional) If given, the number of rowIDs returned will be less than or equal to +``limit``. + :param int column: If given, only rows which have a set bit +in the given column will be returned. + :return: Pilosa query + :rtype: pilosa.PQLQuery + """ + + parts = [u"field=%s" % self.name] + if prev_row: + parts.append(u"previous=%s" % idkey_as_str(prev_row)) + if limit > 0: + parts.append(u"limit=%d" % limit) + if column: + parts.append(u"column=%s" % idkey_as_str(column)) + return PQLQuery(u"Rows(%s)" % u",".join(parts), self.index) + def _binary_operation(self, op, n): q = u"Range(%s %s %d)" % (self.name, op, n) return PQLQuery(q, self.index) diff --git a/pilosa/response.py b/pilosa/response.py index a69feb0..bf7b8f4 100644 --- a/pilosa/response.py +++ b/pilosa/response.py @@ -39,7 +39,9 @@ QUERYRESULT_NONE, QUERYRESULT_ROW, QUERYRESULT_PAIRS, \ -QUERYRESULT_VAL_COUNT, QUERYRESULT_INT, QUERYRESULT_BOOL = range(6) +QUERYRESULT_VAL_COUNT, QUERYRESULT_INT, QUERYRESULT_BOOL, \ +QUERYRESULT_ROW_IDS,\ +QUERYRESULT_GROUP_COUNTS, QUERYRESULT_ROW_IDENTIFIERS = range(9) class RowResult: @@ -70,18 +72,32 @@ def __init__(self, id, key, count): self.count = count +class RowIdentifiersResult: + + def __init__(self, ids=None, keys=None): + self.ids = ids or [] + self.keys = keys or [] + + @classmethod + def from_internal(cls, obj): + return cls(list(obj.Rows), list(obj.Keys)) + + class QueryResult: """Represents one of the results in the response. * See `Query Language `_ """ - def __init__(self, row=None, count_items=None, count=0, value=0, changed=False): + def __init__(self, row=None, count_items=None, count=0, value=0, + changed=False, group_counts=None, row_identifiers=None): self.row = row or RowResult() self.count_items = count_items or [] self.count = count self.value = value self.changed = changed + self.group_counts = group_counts or [] + self.row_identifiers = row_identifiers or RowIdentifiersResult() @classmethod def from_internal(cls, obj): @@ -90,6 +106,8 @@ def from_internal(cls, obj): count = 0 value = 0 changed = False + group_counts = [] + row_identifiers = None if obj.Type == QUERYRESULT_ROW: row = RowResult.from_internal(obj.Row) @@ -105,10 +123,14 @@ def from_internal(cls, obj): value = obj.ValCount.Val elif obj.Type == QUERYRESULT_NONE: pass + elif obj.Type == QUERYRESULT_GROUP_COUNTS: + group_counts = _group_counts_from_internal(obj.GroupCounts) + elif obj.Type == QUERYRESULT_ROW_IDENTIFIERS: + row_identifiers = RowIdentifiersResult.from_internal(obj.RowIdentifiers) else: raise PilosaError("Unknown type: %s" % obj.Type) - return cls(row, count_items, count, value, changed) + return cls(row, count_items, count, value, changed, group_counts, row_identifiers) class ColumnItem: @@ -127,6 +149,54 @@ def _from_internal(cls, obj): return cls(obj.ID, _convert_protobuf_attrs_to_dict(obj.Attrs)) +class FieldRow: + + def __init__(self, field_name, id_key): + self.field_name = field_name + self.id_key = id_key + + def __hash__(self): + return hash((self.field_name, self.id_key)) + + def __eq__(self, other): + if id(self) == id(other): + return True + if other is None or not isinstance(other, self.__class__): + return False + return self.field_name == other.field_name and \ + self.id_key == other.id_key + + def __ne__(self, other): + return not self.__eq__(other) + + def __repr__(self): + return u"FieldRow(%s,%s)" % (self.field_name,self.id_key) + + +class GroupCount: + + def __init__(self, groups, count): + self.groups = groups + self.count = count + + def __hash__(self): + return hash((self.groups, self.count)) + + def __eq__(self, other): + if id(self) == id(other): + return True + if other is None or not isinstance(other, self.__class__): + return False + return self.groups == other.groups and \ + self.count == other.count + + def __ne__(self, other): + return not self.__eq__(other) + + def __repr__(self): + return u"GroupCount(%s,%s)" % (self.groups,self.count) + + class QueryResponse(object): """Represents the response from a Pilosa query. @@ -173,3 +243,14 @@ def _convert_protobuf_attrs_to_dict(attrs): except (IndexError, TypeError): raise PilosaError("Invalid protobuf attribute type: %s" % attr.Type) return d + + +def _group_counts_from_internal(items): + group_counts = [] + for item in items: + groups = [] + for f in item.Group: + field_row = FieldRow(f.Field, f.RowKey) if f.RowKey else FieldRow(f.Field, f.RowID) + groups.append(field_row) + group_counts.append(GroupCount(groups, item.Count)) + return group_counts \ No newline at end of file