about summary refs log tree commit diff
path: root/xapian.i.in
diff options
context:
space:
mode:
authorArun Isaac2026-09-23 01:47:30 +0100
committerArun Isaac2026-09-23 02:00:52 +0100
commit502566073c07eac6a91131847691cc0dbc093b18 (patch)
tree0965d6996003bd77866aa9ef5a7a1053941b0d96 /xapian.i.in
parentaf2d7193314ee6b814c01bc38c9c599ee90fb004 (diff)
downloadguile-xapian-502566073c07eac6a91131847691cc0dbc093b18.tar.gz
guile-xapian-502566073c07eac6a91131847691cc0dbc093b18.tar.lz
guile-xapian-502566073c07eac6a91131847691cc0dbc093b18.zip
Replace query combinator with C++ query builder.
We need composite queries to have more than two subqueries. The only
way to do this is to provide Xapian::Query with an iterator. And to do
this, we need to drop down to C++.
Diffstat (limited to 'xapian.i.in')
-rw-r--r--xapian.i.in19
1 files changed, 18 insertions, 1 deletions
diff --git a/xapian.i.in b/xapian.i.in
index 84695e9..ba923d4 100644
--- a/xapian.i.in
+++ b/xapian.i.in
@@ -1,5 +1,5 @@
 /* guile-xapian --- Guile bindings for Xapian
- * Copyright © 2020, 2023–2024 Arun Isaac <arunisaac@systemreboot.net>
+ * Copyright © 2020, 2023–2024, 2026 Arun Isaac <arunisaac@systemreboot.net>
  * Copyright © 2021, 2022 Bob131 <bob@bob131.so>
  *
  * This file is part of guile-xapian.
@@ -206,3 +206,20 @@ class GuileXapianFieldProcessorWrapper
   ~GuileXapianFieldProcessorWrapper();
   Xapian::Query operator()(std::string const&);
 };
+
+// Build query from subqueries. This needs to be in C++ because we
+// need to provide Xapian::Query with an iterator.
+%{
+  Xapian::Query guile_xapian_build_query(Xapian::Query::op op, SCM subqueries) {
+    int length = scm_to_int(scm_length(subqueries));
+    Xapian::Query **subqueries_arr = (Xapian::Query**) malloc(length * sizeof(Xapian::Query*));
+    for (int i=0; i<length; i++)
+      SWIG_ConvertPtr(scm_list_ref(subqueries, scm_from_int(i)),
+                      (void**)&subqueries_arr[i],
+                      SWIGTYPE_p_Xapian__Query,
+                      0);
+    return Xapian::Query(op, subqueries_arr, subqueries_arr + length);
+  }
+%}
+
+Xapian::Query guile_xapian_build_query(Xapian::Query::op, SCM);