-
Notifications
You must be signed in to change notification settings - Fork 892
Expand file tree
/
Copy pathvidx_func.h
More file actions
132 lines (108 loc) · 4.63 KB
/
vidx_func.h
File metadata and controls
132 lines (108 loc) · 4.63 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#ifndef VIDX_FUNC_INCLUDED
#define VIDX_FUNC_INCLUDED
/* Copyright (c) 2025, 2025, Alibaba and/or its affiliates. All rights reserved.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License, version 2.0,
as published by the Free Software Foundation.
This program is also distributed with certain software (including
but not limited to OpenSSL) that is licensed under separate terms,
as designated in a particular file or component or in included license
documentation. The authors of MySQL hereby grant you an additional
permission to link the program and your derivative works with the
separately licensed software that they have included with MySQL.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License, version 2.0, for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
#include "vidx/vidx_common.h"
class ORDER;
namespace vidx {
enum distance_kind { EUCLIDEAN, COSINE, AUTO };
class Item_func_vec_distance : public Item_real_func {
public:
Item_func_vec_distance(const POS &pos, Item *a, Item *b)
: Item_real_func(pos, a, b), kind(AUTO) {}
Item_func_vec_distance(const POS &pos, Item *a, Item *b, distance_kind c)
: Item_real_func(pos, a, b), kind(c) {}
const char *func_name() const override {
static LEX_CSTRING name[3] = {{STRING_WITH_LEN("VEC_DISTANCE_EUCLIDEAN")},
{STRING_WITH_LEN("VEC_DISTANCE_COSINE")},
{STRING_WITH_LEN("VEC_DISTANCE")}};
return name[kind].str;
}
bool resolve_type(THD *thd) override;
int get_key();
double val_real() override;
enum Functype functype() const override { return VECTOR_DISTANCE_FUNC; }
ha_rows get_limit() const { return m_limit; }
void set_limit(const ha_rows &limit) { m_limit = limit; }
Item *get_const_arg() const { return const_arg; }
private:
bool check_args();
distance_kind kind;
double (*calc_distance_func)(float *v1, float *v2, size_t v_len);
ha_rows m_limit = 0;
Item_field *field_arg = nullptr;
Item *const_arg = nullptr;
};
class Item_func_vec_distance_euclidean final : public Item_func_vec_distance {
public:
Item_func_vec_distance_euclidean(const POS &pos, Item *a, Item *b)
: Item_func_vec_distance(pos, a, b, distance_kind::EUCLIDEAN) {}
};
class Item_func_vec_distance_cosine final : public Item_func_vec_distance {
public:
Item_func_vec_distance_cosine(const POS &pos, Item *a, Item *b)
: Item_func_vec_distance(pos, a, b, distance_kind::COSINE) {}
};
class Item_func_vec_fromtext final : public Item_str_func {
String buffer;
public:
Item_func_vec_fromtext(const POS &pos, Item *a) : Item_str_func(pos, a) {}
bool resolve_type(THD *thd) override;
const char *func_name() const override { return "VEC_FromText"; }
String *val_str(String *str) override;
};
class Item_func_vec_totext final : public Item_str_func {
static const uint32_t per_value_chars = 16;
static const uint32_t max_output_bytes =
(MAX_DIMENSIONS * Item_func_vec_totext::per_value_chars);
String buffer;
public:
Item_func_vec_totext(const POS &pos, Item *a) : Item_str_func(pos, a) {
collation.set(&my_charset_utf8mb4_0900_bin);
}
bool resolve_type(THD *thd) override;
const char *func_name() const override { return "VEC_ToText"; }
String *val_str(String *str) override;
};
class Item_func_vector_dim : public Item_int_func {
String value;
public:
Item_func_vector_dim(const POS &pos, Item *a) : Item_int_func(pos, a) {}
longlong val_int() override;
const char *func_name() const override { return "vector_dim"; }
bool resolve_type(THD *thd) override {
if (param_type_is_default(thd, 0, 1, MYSQL_TYPE_VARCHAR)) {
return true;
}
bool valid_type = (args[0]->data_type() == MYSQL_TYPE_VARCHAR) ||
(args[0]->result_type() == STRING_RESULT &&
args[0]->collation.collation == &my_charset_bin);
if (!valid_type) {
my_error(ER_WRONG_ARGUMENTS, MYF(0), func_name());
return true;
}
max_length = 10;
return false;
}
};
static inline bool check_item_func_vec_distance(const Item *item) {
return item->type() == Item::FUNC_ITEM &&
((Item_func *)item)->functype() == Item_func::VECTOR_DISTANCE_FUNC;
}
} // namespace vidx
#endif /* VIDX_FUNC_INCLUDED */