;;; guile-xapian --- Guile bindings for Xapian
;;; Copyright © 2020 Arun Isaac <arunisaac@systemreboot.net>
;;;
;;; This file is part of guile-xapian.
;;;
;;; guile-xapian is free software: you can redistribute it and/or
;;; modify it under the terms of the GNU General Public License as
;;; published by the Free Software Foundation, either version 2 of the
;;; License, or (at your option) any later version.
;;;
;;; guile-xapian is distributed in the hope that it will be useful,
;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
;;; General Public License for more details.
;;;
;;; You should have received a copy of the GNU General Public License
;;; along with guile-xapian.  If not, see
;;; <https://www.gnu.org/licenses/>.

(use-modules (ice-9 format)
             (ice-9 match)
             (xapian xapian))

(define (get-title record)
  (match record
    ((description title identifier) title)))

(define* (search dbpath querystring #:key (offset 0) (pagesize 10))
  (call-with-database dbpath
    (lambda (db)
      (let ((query (parse-query querystring
                                #:stemmer (make-stem "en")
                                #:prefixes '(("title" ."S")
                                             ("description" . "XD")))))
        (mset-fold (lambda (item _)
                     (format #t "~a: #~3,'0d ~a~%"
                             (mset-item-rank item)
                             (mset-item-docid item)
                             (get-title
                              (call-with-input-string
                                  (document-data (mset-item-document item))
                                read))))
                   #f
                   (enquire-mset (enquire db query) offset pagesize))))))

(match (command-line)
  ((_ dbpath . query-terms)
   (search dbpath (string-join query-terms)))
  ((program . _)
   (format (current-error-port) "Usage: ~a DBPATH QUERYTERM...~%" program)))