27 #include "cif++/category.hpp" 28 #include "cif++/condition.hpp" 29 #include "cif++/file.hpp" 36 return cat.key_fields();
41 return cat.get_column_ix(col);
48 auto cv = cat.get_cat_validator();
51 auto iv = cv->get_validator_for_item(col);
52 if (iv !=
nullptr and iv->m_type !=
nullptr)
54 auto type = iv->m_type;
55 result =
type->m_primitive_type == DDL_PrimitiveType::UChar;
65 condition_impl *key_equals_condition_impl::prepare(
const category &
c)
67 m_item_ix = c.get_column_ix(m_item_tag);
70 if (c.get_cat_validator() !=
nullptr and
71 c.key_field_indices().size() == 1)
73 const auto field_keys = c.key_field_indices();
74 if (field_keys.find(m_item_ix) != field_keys.end()) {
75 m_single_hit = c[{ { m_item_tag, m_value } }];
82 bool found_in_range(condition_impl *c, std::vector<and_condition_impl *>::iterator
b, std::vector<and_condition_impl *>::iterator e)
86 for (
auto s = b; s != e; ++s)
88 auto &
cs = (*s)->m_sub;
90 if (find_if(
cs.begin(),
cs.end(), [
c](
const condition_impl *
i) {
return i->equals(c); }) ==
cs.end())
100 condition_impl *and_condition_impl::combine_equal(std::vector<and_condition_impl *> &subs, or_condition_impl *oc)
102 and_condition_impl *and_result =
nullptr;
104 auto first = subs.front();
105 auto &fc =
first->m_sub;
112 if (and_result ==
nullptr)
113 and_result =
new and_condition_impl();
115 and_result->m_sub.push_back(c);
116 fc.erase(
remove(fc.begin(), fc.end(),
c), fc.end());
118 for (
auto sub : subs)
120 auto &ssub = sub->m_sub;
124 if (not sc->equals(c))
127 ssub.erase(
remove(ssub.begin(), ssub.end(), sc), ssub.end());
134 if (and_result !=
nullptr)
136 and_result->m_sub.push_back(oc);
143 condition_impl *or_condition_impl::prepare(
const category &c)
145 std::vector<and_condition_impl *> and_conditions;
147 for (
auto &sub : m_sub)
149 sub = sub->prepare(c);
150 if (
typeid(*sub) ==
typeid(and_condition_impl))
151 and_conditions.push_back(static_cast<and_condition_impl *>(sub));
154 if (and_conditions.size() == m_sub.size())
155 return and_condition_impl::combine_equal(and_conditions,
this);
162 void condition::prepare(
const category &
c)
165 m_impl = m_impl->prepare(c);
bool found_in_range(condition_impl *c, std::vector< and_condition_impl *>::iterator b, std::vector< and_condition_impl *>::iterator e)
bool is_column_type_uchar(const category &cat, std::string_view col)
uint16_t get_column_ix(const category &cat, std::string_view col)
iset get_category_fields(const category &cat)