From b580f1548ff335a0e1fa004fc6626486535c94e1 Mon Sep 17 00:00:00 2001
From: Boris Kolpackov <boris@codesynthesis.com>
Date: Thu, 21 Feb 2013 11:07:25 +0200
Subject: Add support for pattern matching (SQL LIKE)

---
 odb/sqlite/query-dynamic.cxx | 16 ++++++++++++++
 odb/sqlite/query.hxx         | 41 +++++++++++++++++++++++++++++++++++
 odb/sqlite/query.txx         | 51 ++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 108 insertions(+)

diff --git a/odb/sqlite/query-dynamic.cxx b/odb/sqlite/query-dynamic.cxx
index aeeb841..343e42c 100644
--- a/odb/sqlite/query-dynamic.cxx
+++ b/odb/sqlite/query-dynamic.cxx
@@ -110,6 +110,22 @@ namespace odb
           q += ")";
           break;
         }
+      case part::op_like:
+        {
+          translate (q, s, p - 2); // column
+          q += "LIKE";
+          translate (q, s, p - 1); // pattern
+          break;
+        }
+      case part::op_like_escape:
+        {
+          translate (q, s, p - 3); // column
+          q += "LIKE";
+          translate (q, s, p - 2); // pattern
+          q += "ESCAPE";
+          translate (q, s, p - 1); // escape
+          break;
+        }
       case part::op_eq:
       case part::op_ne:
       case part::op_lt:
diff --git a/odb/sqlite/query.hxx b/odb/sqlite/query.hxx
index b6d5bb9..31bd922 100644
--- a/odb/sqlite/query.hxx
+++ b/odb/sqlite/query.hxx
@@ -741,6 +741,47 @@ namespace odb
       query_base
       in_range (I begin, I end) const;
 
+      // like
+      //
+    public:
+      query_base
+      like (decayed_type pattern) const
+      {
+        return like (val_bind<T> (pattern));
+      }
+
+      query_base
+      like (val_bind<T> pattern) const;
+
+      template <typename T2>
+      query_base
+      like (val_bind<T2> pattern) const
+      {
+        return like (val_bind<T> (decayed_type (pattern.val)));
+      }
+
+      query_base
+      like (ref_bind<T> pattern) const;
+
+      query_base
+      like (decayed_type pattern, decayed_type escape) const
+      {
+        return like (val_bind<T> (pattern), escape);
+      }
+
+      query_base
+      like (val_bind<T> pattern, decayed_type escape) const;
+
+      template <typename T2>
+      query_base
+      like (val_bind<T2> pattern, decayed_type escape) const
+      {
+        return like (val_bind<T> (decayed_type (pattern.val)), escape);
+      }
+
+      query_base
+      like (ref_bind<T> pattern, decayed_type escape) const;
+
       // =
       //
     public:
diff --git a/odb/sqlite/query.txx b/odb/sqlite/query.txx
index b63d5a1..ed2e5b4 100644
--- a/odb/sqlite/query.txx
+++ b/odb/sqlite/query.txx
@@ -6,6 +6,7 @@ namespace odb
 {
   namespace sqlite
   {
+    //
     // query_base
     //
 
@@ -22,8 +23,12 @@ namespace odb
       append<bool, ID> (val_bind<bool> (true), c.conversion ());
     }
 
+    //
     // query_column
     //
+
+    // in
+    //
     template <typename T, database_type_id ID>
     query_base query_column<T, ID>::
     in (decayed_type v1, decayed_type v2) const
@@ -109,5 +114,51 @@ namespace odb
       q += ")";
       return q;
     }
+
+    // like
+    //
+    template <typename T, database_type_id ID>
+    query_base query_column<T, ID>::
+    like (val_bind<T> p) const
+    {
+      query_base q (table_, column_);
+      q += "LIKE";
+      q.append<T, ID> (p, conversion_);
+      return q;
+    }
+
+    template <typename T, database_type_id ID>
+    query_base query_column<T, ID>::
+    like (ref_bind<T> p) const
+    {
+      query_base q (table_, column_);
+      q += "LIKE";
+      q.append<T, ID> (p, conversion_);
+      return q;
+    }
+
+    template <typename T, database_type_id ID>
+    query_base query_column<T, ID>::
+    like (val_bind<T> p, decayed_type e) const
+    {
+      query_base q (table_, column_);
+      q += "LIKE";
+      q.append<T, ID> (p, conversion_);
+      q += "ESCAPE";
+      q.append<T, ID> (val_bind<T> (e), conversion_);
+      return q;
+    }
+
+    template <typename T, database_type_id ID>
+    query_base query_column<T, ID>::
+    like (ref_bind<T> p, decayed_type e) const
+    {
+      query_base q (table_, column_);
+      q += "LIKE";
+      q.append<T, ID> (p, conversion_);
+      q += "ESCAPE";
+      q.append<T, ID> (val_bind<T> (e), conversion_);
+      return q;
+    }
   }
 }
-- 
cgit v1.1