mirror of
https://github.com/asg017/sqlite-vec.git
synced 2026-04-25 00:36:56 +02:00
text knn LT/LE
This commit is contained in:
parent
df29e31ddc
commit
018e9789de
3 changed files with 338 additions and 53 deletions
62
sqlite-vec.c
62
sqlite-vec.c
|
|
@ -6027,21 +6027,63 @@ int vec0_metadata_filter_text(vec0_vtab * p, sqlite3_value * value, const void *
|
|||
}
|
||||
case VEC0_METADATA_OPERATOR_LE: {
|
||||
for(int i = 0; i < size; i++) {
|
||||
u8 * view = &((u8*) buffer)[i * VEC0_METADATA_TEXT_VIEW_BUFFER_LENGTH];
|
||||
int n = ((int*) view)[0];
|
||||
char * s = (char *) &view[4];
|
||||
if(n > VEC0_METADATA_TEXT_VIEW_DATA_LENGTH) {rc = SQLITE_ERROR;goto done;} /* TODO */
|
||||
bitmap_set(b, i, strncmp(s, sTarget, n) <= 0);
|
||||
view = &((u8*) buffer)[i * VEC0_METADATA_TEXT_VIEW_BUFFER_LENGTH];
|
||||
nPrefix = ((int*) view)[0];
|
||||
sPrefix = (char *) &view[4];
|
||||
int cmpPrefix = strncmp(sPrefix, sTarget, min(min(nPrefix, VEC0_METADATA_TEXT_VIEW_DATA_LENGTH), nTarget));
|
||||
|
||||
if(nPrefix < VEC0_METADATA_TEXT_VIEW_DATA_LENGTH) {
|
||||
// if prefix match, check which is longer
|
||||
if(cmpPrefix == 0) {
|
||||
bitmap_set(b, i, nPrefix <= nTarget);
|
||||
}
|
||||
else {
|
||||
bitmap_set(b, i, cmpPrefix <= 0);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
// TODO(perf): may not need to compare full text in some cases
|
||||
|
||||
rc = vec0_get_metadata_text_long_value(p, &stmt, metadata_idx, rowids[i], &nFull, &sFull);
|
||||
if(rc != SQLITE_OK) {
|
||||
goto done;
|
||||
}
|
||||
if(nPrefix != nFull) {
|
||||
rc = SQLITE_ERROR;
|
||||
goto done;
|
||||
}
|
||||
bitmap_set(b, i, strncmp(sFull, sTarget, nFull) <= 0);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case VEC0_METADATA_OPERATOR_LT: {
|
||||
for(int i = 0; i < size; i++) {
|
||||
u8 * view = &((u8*) buffer)[i * VEC0_METADATA_TEXT_VIEW_BUFFER_LENGTH];
|
||||
int n = ((int*) view)[0];
|
||||
char * s = (char *) &view[4];
|
||||
if(n > VEC0_METADATA_TEXT_VIEW_DATA_LENGTH) {rc = SQLITE_ERROR;goto done;} /* TODO */
|
||||
bitmap_set(b, i, strncmp(s, sTarget, n) < 0);
|
||||
view = &((u8*) buffer)[i * VEC0_METADATA_TEXT_VIEW_BUFFER_LENGTH];
|
||||
nPrefix = ((int*) view)[0];
|
||||
sPrefix = (char *) &view[4];
|
||||
int cmpPrefix = strncmp(sPrefix, sTarget, min(min(nPrefix, VEC0_METADATA_TEXT_VIEW_DATA_LENGTH), nTarget));
|
||||
|
||||
if(nPrefix < VEC0_METADATA_TEXT_VIEW_DATA_LENGTH) {
|
||||
// if prefix match, check which is longer
|
||||
if(cmpPrefix == 0) {
|
||||
bitmap_set(b, i, nPrefix < nTarget);
|
||||
}
|
||||
else {
|
||||
bitmap_set(b, i, cmpPrefix < 0);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
// TODO(perf): may not need to compare full text in some cases
|
||||
|
||||
rc = vec0_get_metadata_text_long_value(p, &stmt, metadata_idx, rowids[i], &nFull, &sFull);
|
||||
if(rc != SQLITE_OK) {
|
||||
goto done;
|
||||
}
|
||||
if(nPrefix != nFull) {
|
||||
rc = SQLITE_ERROR;
|
||||
goto done;
|
||||
}
|
||||
bitmap_set(b, i, strncmp(sFull, sTarget, nFull) < 0);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue