R ColumnBase::aggregate(T target, std::size_t start, std::size_t end, std::size_t limit, std::size_t* return_ndx) const { condition cond; int c = condition::condition; typedef typename ColumnTypeTraits2<condition, T>::column_type ColType; typedef typename ColumnTypeTraits2<condition, T>::array_type ArrType; if (end == std::size_t(-1)) end = size(); QueryState<R> state; state.init(action, null_ptr, limit); ColType* column = const_cast<ColType*>(static_cast<const ColType*>(this)); SequentialGetter<T> sg(column); bool cont = true; for (size_t s = start; cont && s < end; ) { sg.cache_next(s); size_t end2 = sg.local_end(end); if(util::SameType<T, int64_t>::value) { cont = (static_cast<const Array*>(sg.m_array_ptr))->find(c, action, int64_t(target), s - sg.m_leaf_start, end2, sg.m_leaf_start, reinterpret_cast<QueryState<int64_t>*>(&state)); } else { for(size_t local_index = s - sg.m_leaf_start; cont && local_index < end2; local_index++) { T v = ((ArrType*)(sg.m_array_ptr))->get(local_index); if(cond(v, target)) { cont = (static_cast<QueryState<R>*>(&state))->template match<action, false>(s + local_index , 0, static_cast<R>(v)); } } } s = end2 + sg.m_leaf_start; } if (return_ndx) *return_ndx = state.m_minmax_index; return state.m_state; }
R aggregate(const ColType& column, T target, size_t start, size_t end, size_t limit, size_t* return_ndx) { if (end == npos) end = column.size(); QueryState<R> state; state.init(action, nullptr, limit); SequentialGetter<ColType> sg { &column }; bool cont = true; for (size_t s = start; cont && s < end; ) { sg.cache_next(s); size_t start2 = s - sg.m_leaf_start; size_t end2 = sg.local_end(end); cont = _impl::FindInLeaf<ColType>::template find<action, Condition>(*sg.m_leaf_ptr, target, start2, end2, sg.m_leaf_start, state); s = sg.m_leaf_start + end2; } if (return_ndx) *return_ndx = state.m_minmax_index; return state.m_state; }