18 #include "../Shared/sqltypes.h"
19 #include "../Utils/Regexp.h"
20 #include "../Utils/StringLike.h"
25 #include <sys/fcntl.h>
30 const ssize_t generation)
31 : string_dict_(sd), generation_(generation) {}
42 mapd_lock_guard<mapd_shared_mutex> write_lock(
rw_mutex_);
67 mapd_shared_lock<mapd_shared_mutex> read_lock(
rw_mutex_);
79 mapd_shared_lock<mapd_shared_mutex> read_lock(
rw_mutex_);
90 if (inline_int_null_value<int32_t>() == string_id) {
93 mapd_shared_lock<mapd_shared_mutex> read_lock(
rw_mutex_);
106 const std::string& pattern,
108 const bool is_simple,
112 str.c_str(), str.size(), pattern.c_str(), pattern.size())
119 str.c_str(), str.size(), pattern.c_str(), pattern.size())
131 const bool is_simple,
132 const char escape)
const {
137 if (
is_like(str, pattern, icase, is_simple, escape)) {
138 result.push_back(kv.first);
147 const std::string& pattern,
148 const std::string& comp_operator) {
149 int res = str.compare(pattern);
150 if (comp_operator ==
"<") {
152 }
else if (comp_operator ==
"<=") {
154 }
else if (comp_operator ==
"=") {
156 }
else if (comp_operator ==
">") {
158 }
else if (comp_operator ==
">=") {
160 }
else if (comp_operator ==
"<>") {
163 throw std::runtime_error(
"unsupported string compare operator");
169 const std::string& pattern,
170 const std::string& comp_operator)
const {
175 if (
do_compare(str, pattern, comp_operator)) {
176 result.push_back(kv.first);
185 const std::string& pattern,
187 return regexp_like(str.c_str(), str.size(), pattern.c_str(), pattern.size(), escape);
193 const char escape)
const {
199 result.push_back(kv.first);
206 return string_dict_->getOrAdd(str);
211 return string_dict_.get()->getStringBytes(string_id);
219 if (generation == -1) {
222 if (generation_ != -1) {
226 generation_ = generation;
std::pair< char *, size_t > getStringBytes(int32_t string_id) const noexcept
std::vector< int32_t > getLike(const std::string &pattern, const bool icase, const bool is_simple, const char escape) const
std::map< int32_t, std::string > transient_int_to_str_
StringDictionary * getDictionary() noexcept
void updateGeneration(const ssize_t generation) noexcept
int32_t getIdOfStringNoGeneration(const std::string &str) const
size_t storageEntryCount() const
std::string getString(int32_t string_id) const
ssize_t getGeneration() const noexcept
std::vector< int32_t > getCompare(const std::string &pattern, const std::string &comp_operator) const
bool is_regexp_like(const std::string &str, const std::string &pattern, const char escape)
static constexpr int32_t INVALID_STR_ID
std::shared_ptr< StringDictionary > string_dict_
DEVICE bool regexp_like(const char *str, const int32_t str_len, const char *pattern, const int32_t pat_len, const char escape_char)
DEVICE bool string_ilike(const char *str, const int32_t str_len, const char *pattern, const int32_t pat_len, const char escape_char)
DEVICE bool string_like(const char *str, const int32_t str_len, const char *pattern, const int32_t pat_len, const char escape_char)
std::map< std::string, int32_t > transient_str_to_int_
StringDictionaryProxy(std::shared_ptr< StringDictionary > sd, const ssize_t generation)
bool is_like(const std::string &str, const std::string &pattern, const bool icase, const bool is_simple, const char escape)
DEVICE bool string_ilike_simple(const char *str, const int32_t str_len, const char *pattern, const int32_t pat_len)
bool do_compare(const std::string &str, const std::string &pattern, const std::string &comp_operator)
std::vector< int32_t > getRegexpLike(const std::string &pattern, const char escape) const
int32_t getOrAdd(const std::string &str) noexcept
int32_t getOrAddTransient(const std::string &str)
int32_t getIdOfString(const std::string &str) const
DEVICE bool string_like_simple(const char *str, const int32_t str_len, const char *pattern, const int32_t pat_len)
mapd_shared_mutex rw_mutex_
int32_t truncate_to_generation(const int32_t id, const size_t generation)