/* * Copyright (C) 2016 Charybdis Development Team * Copyright (C) 2016 Jason Volk * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice is present in all copies. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * */ #pragma once #define HAVE_IRCD_DB_WHERE_H namespace ircd::db { template struct where; } template struct ircd::db::where { struct equal; struct not_equal; struct logical_not; struct logical_and; struct logical_or; struct test; struct noop; virtual bool operator()(const tuple &) const = 0; virtual ~where() noexcept = default; }; namespace ircd::db { template typename where::logical_or operator||(const where &, const where &); template typename where::logical_and operator&&(const where &, const where &); template typename where::logical_not operator!(const where &); } template struct ircd::db::where::equal :ircd::db::where { tuple value; bool operator()(const tuple &) const override; equal(const tuple &value) :value{value} {} equal(const json::members &members) :value{members} {} }; template bool ircd::db::where::equal::operator()(const tuple &value) const { return json::until(this->value, value, [] (const auto &key, const auto &a, const auto &b) { if(!a) return true; return a == b; }); } template struct ircd::db::where::not_equal :ircd::db::where { tuple value; bool operator()(const tuple &) const override; not_equal(const tuple &value) :value{value} {} not_equal(const json::members &members) :value{members} {} }; template bool ircd::db::where::not_equal::operator()(const tuple &value) const { return !json::until(this->value, value, [] (const auto &key, const auto &a, const auto &b) { if(!a) return true; return a == b; }); } template struct ircd::db::where::logical_and :ircd::db::where { const where *a, *b; bool operator()(const tuple &t) const override { return (*a)(t) && (*b)(t); } logical_and(const where &a, const where &b) :a{&a} ,b{&b} {} }; template typename ircd::db::where::logical_and ircd::db::operator&&(const where &a, const where &b) { return { a, b }; } template struct ircd::db::where::logical_or :ircd::db::where { const where *a, *b; bool operator()(const tuple &t) const override { return (*a)(t) || (*b)(t); } logical_or(const where &a, const where &b) :a{&a} ,b{&b} {} }; template typename ircd::db::where::logical_or ircd::db::operator||(const where &a, const where &b) { return { a, b }; } template struct ircd::db::where::logical_not :ircd::db::where { const where *a; bool operator()(const tuple &t) const override { return !(*a)(t); } logical_not(const where &a) :a{&a} {} }; template typename ircd::db::where::logical_not ircd::db::operator!(const where &a) { return { a }; } template struct ircd::db::where::test :ircd::db::where { using function = std::function; function closure; bool operator()(const tuple &t) const override { return closure(t); } test(function closure) :closure{std::move(closure)} {} }; template struct ircd::db::where::noop :ircd::db::where { bool operator()(const tuple &) const override { return true; } };