Skip to content

Commit 480930b

Browse files
WinChuayongcai
and
yongcai
authored
Feature/enhance (#58)
* feat: support for vector; quick mode for geo && vector data for dump --------- Co-authored-by: yongcai <[email protected]>
1 parent f58636b commit 480930b

File tree

4 files changed

+27
-7
lines changed

4 files changed

+27
-7
lines changed

src/pyinnodb/cli/sql.py

+2
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,8 @@ def transfter(nd):
9696
elif isinstance(field, MGeo):
9797
d = field.build().hex() # .zfill(50)
9898
vs.append("0x" + d)
99+
elif isinstance(field, bytes):
100+
vs.append("0x"+field.hex())
99101
else:
100102
vs.append(repr(field))
101103
values.append(f"({','.join(vs)})")

src/pyinnodb/const/dd_column_type.py

+5
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ class DDColumnType(Enum):
3636
STRING = 29
3737
GEOMETRY = 30
3838
JSON = 31
39+
VECTOR = 32
3940

4041
def is_int_number(self):
4142
return self in _int_number_type
@@ -88,13 +89,16 @@ def is_big(cls, t):
8889
DDColumnType.JSON,
8990
DDColumnType.TINY_BLOB,
9091
DDColumnType.GEOMETRY,
92+
DDColumnType.VECTOR,
9193
]
9294

9395
_big_type = [
9496
DDColumnType.MEDIUM_BLOB,
9597
DDColumnType.LONG_BLOB,
9698
DDColumnType.BLOB,
9799
DDColumnType.JSON,
100+
DDColumnType.GEOMETRY,
101+
DDColumnType.VECTOR,
98102
]
99103

100104
DDColConf = namedtuple("DDColConf", "type size")
@@ -132,6 +136,7 @@ class DDColConf(DDColConf, Enum):
132136
STRING = DDColumnType.STRING, 0
133137
GEOMETRY = DDColumnType.GEOMETRY, 0
134138
JSON = DDColumnType.JSON, 0
139+
VECTOR = DDColumnType.VECTOR, 0
135140

136141
@classmethod
137142
def get_col_type_conf(cls, type) -> DDColConf:

src/pyinnodb/disk_struct/index.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ class MIndexPage(CC):
109109
system_records: MIndexSystemRecord = cfield(MIndexSystemRecord)
110110

111111
@classmethod
112-
def default_value_parser(cls, dd_object: Table, transfter=None, hidden_col=False):
112+
def default_value_parser(cls, dd_object: Table, transfter=None, hidden_col=False, quick=True):
113113
primary_data_layout_col = dd_object.get_disk_data_layout()
114114

115115
def value_parser(rh: MRecordHeader, f):
@@ -227,7 +227,7 @@ def value_parser(rh: MRecordHeader, f):
227227
if col.ordinal_position in null_col_data:
228228
col_value = None
229229
else:
230-
col_value = col.read_data(f, vs)
230+
col_value = col.read_data(f, vs, quick=quick)
231231
except Exception as e:
232232
print("cur before is ", cur_before, vs, col)
233233
raise e

src/pyinnodb/sdi/table.py

+18-5
Original file line numberDiff line numberDiff line change
@@ -395,7 +395,7 @@ def _read_varchar(self, stream, size):
395395
else:
396396
return data
397397

398-
def read_data(self, stream, size=None):
398+
def read_data(self, stream, size=None, quick=True):
399399
if self.name == "DB_ROLL_PTR":
400400
return MRollbackPointer.parse_stream(stream)
401401
dtype = DDColumnType(self.type)
@@ -405,6 +405,15 @@ def read_data(self, stream, size=None):
405405
dsize = self.size
406406
if dtype.is_int_number():
407407
return self._read_int(stream, dsize)
408+
elif dtype == DDColumnType.VECTOR:
409+
if quick:
410+
return stream.read(dsize)
411+
else:
412+
vec = []
413+
for i in range(int(dsize / 4)):
414+
byte_data = stream.read(4)
415+
vec.append(struct.unpack("f", byte_data)[0])
416+
return vec
408417
elif dtype == DDColumnType.FLOAT:
409418
byte_data = stream.read(dsize)
410419
if dsize == 4:
@@ -476,9 +485,12 @@ def read_data(self, stream, size=None):
476485
except Exception as e:
477486
return data
478487
elif dtype == DDColumnType.GEOMETRY:
479-
data = MGeo.parse_stream(stream)
480-
logging.debug("geometry data is %s, size is %d", data, dsize)
481-
return data
488+
if quick:
489+
return stream.read(dsize)
490+
else:
491+
data = MGeo.parse_stream(stream)
492+
logging.debug("geometry data is %s, size is %d", data, dsize)
493+
return data
482494

483495

484496
decimal_leftover_part = {
@@ -846,7 +858,8 @@ def search(self, f, primary_key, hidden_col):
846858
else:
847859
primary_key = self.build_primary_key_bytes((primary_key,))
848860
value_parser = MIndexPage.default_value_parser(
849-
self, hidden_col=hidden_col, transfter=lambda id: id
861+
self, hidden_col=hidden_col, transfter=lambda id: id,
862+
quick=False,
850863
)
851864

852865
while first_leaf_page != 4294967295:

0 commit comments

Comments
 (0)