45template <
typename Range,
typename Value =
typename Range::value_type>
46static std::string
join(Range
const& elements,
const char *
const delimiter) {
47 std::ostringstream os;
48 auto b = begin(elements), e = end(elements);
51 std::copy(b, prev(e), std::ostream_iterator<Value>(os, delimiter));
73 if(s.size() < 2 || s.front() !=
'(' || s.back() !=
')')
79 for(
size_t i = 0; i < s.size() - 1; ++i) {
80 if(s[i] ==
'(') ++depth;
81 else if(s[i] ==
')') {
89 const std::string inner = s.substr(1, s.size() - 2);
91 for(
size_t i = 0; i + op.size() <= inner.size(); ) {
92 if(inner[i] ==
'(') { ++depth; ++i; }
93 else if(inner[i] ==
')') { --depth; ++i; }
94 else if(depth == 0 && inner.compare(i, op.size(), op) == 0)
128 std::vector<value_type> flat;
129 flat.reserve(v.size());
130 for(
const auto &x : v)
132 return "("+
join(flat,
" â ")+
")";
139 std::vector<value_type> flat;
140 flat.reserve(v.size());
141 for(
const auto &x : v)
143 return "("+
join(flat,
" â ")+
")";
147 return "("+x+
" â "+y+
")";
157 std::string result =
"["+s1+
" ";
178 return result+
" "+s2+
"]";
233 for(
size_t i = 1; i<s.size(); ++i) {
270 return std::string(v);
290 if(s.size() < 2 || s.front() !=
'(' || s.back() !=
')')
293 for(
size_t i = 0; i < s.size() - 1; ++i) {
294 if(s[i] ==
'(') ++depth;
295 else if(s[i] ==
')') {
300 return s.substr(1, s.size() - 2);
AggregationOperator
SQL aggregation functions tracked by ProvSQL.
@ OR
Boolean OR aggregate.
@ COUNT
COUNT(*) or COUNT(expr) â integer.
@ AND
Boolean AND aggregate.
@ SUM
SUM â integer or float.
@ ARRAY_AGG
Array aggregation.
@ NONE
No aggregation (returns NULL).
@ CHOOSE
Arbitrary selection (pick one element).
ComparisonOperator
SQL comparison operators used in gate_cmp circuit gates.
@ LE
Less than or equal (<=).
@ GE
Greater than or equal (>=).
Abstract semiring interface for provenance evaluation.
Abstract base class for (m-)semirings.