Use a full table scan for search so artist can included.
authorNot Zed <notzed@gmail.com>
Sun, 7 Jan 2024 21:52:42 +0000 (08:22 +1030)
committerNot Zed <notzed@gmail.com>
Sun, 7 Jan 2024 21:52:42 +0000 (08:22 +1030)
Remove some spew which was causing performance problems.

dbindex.c
disk-util.c
http-monitor.c

index 1f0745b..28ee838 100644 (file)
--- a/dbindex.c
+++ b/dbindex.c
@@ -543,8 +543,6 @@ dbfile *dbfile_get(dbtxn *tx, dbindex *db, int fileid) {
 
        db->res = mdb_get(tx, db->file, &key, &data);
 
-       printf("dbfile_get(%d) = %d\n", fileid, db->res);
-
        if (db->res == 0) {
                dbfile *p = calloc(1, sizeof(*p));
 
@@ -1878,14 +1876,14 @@ int dbfile_prev_list(dbindex *db, int listid, dbfile **fp) {
 #include <regex.h>
 
 // TODO: should run over title index instead?
-int dbfile_searchx(dbindex *db, const char *pattern, dbfile **results, int maxlen) {
+// TODO: use dbscan interface?
+int dbfile_search(dbindex *db, const char *pattern, dbfile **results, int maxlen) {
        MDB_txn *tx;
        MDB_val key, data;
        MDB_cursor *cursor;
        int res;
        regex_t reg;
 
-       printf("search, pattern='%s'\n", pattern);
        res = regcomp(&reg, pattern, REG_EXTENDED | REG_ICASE | REG_NOSUB);
        if (res != 0)
                return res;
@@ -1901,7 +1899,8 @@ int dbfile_searchx(dbindex *db, const char *pattern, dbfile **results, int maxle
                if (db->res == 0) {
                        dbfile *file = ez_basic_decode(DBFILE_DESC, (ez_blob *)&data);
 
-                       if (regexec(&reg, file->title, 0, NULL, 0) == 0) {
+                       if (regexec(&reg, file->title, 0, NULL, 0) == 0
+                               || regexec(&reg, file->artist, 0, NULL, 0) == 0) {
                                file->id = *(int *)key.mv_data;
                                results[i++] = file;
                        } else {
@@ -1915,6 +1914,8 @@ int dbfile_searchx(dbindex *db, const char *pattern, dbfile **results, int maxle
        regfree(&reg);
        mdb_txn_abort(tx);
 
+       printf("search, pattern='%s', n=%d\n", pattern, i);
+
        return i;
 
 fail:
@@ -1927,7 +1928,8 @@ fail:
 // run over title index
 // TODO: use multi-get on the values, so only match key (title) once per duplicate data.
 // TODO: use dbscan interface?
-int dbfile_search(dbindex *db, const char *pattern, dbfile **results, int maxlen) {
+// TODO: remove?  This isn't really very useful without a full substring index.
+int dbfile_searchx(dbindex *db, const char *pattern, dbfile **results, int maxlen) {
        MDB_txn *tx;
        MDB_val key, data;
        MDB_cursor *cursor;
index a2f8c9a..215a77d 100644 (file)
@@ -240,7 +240,7 @@ int main(int argc, char **argv) {
 
                        if (res >= 0) {
                                for (int i=0;i<res;i++) {
-                                       printf("%4d title: %s\n", results[i]->id, results[i]->title);
+                                       printf("%6d %-50s %s\n", results[i]->id, results[i]->artist, results[i]->title);
                                        dbfile_free(results[i]);
                                }
                        } else {
index aa52d1a..de5ebbc 100644 (file)
@@ -29,6 +29,8 @@
 
 #include "player.h"
 
+#define MAX_SEARCH_RESULTS 300
+
 static dbindex *db;
 static notify_t player;
 
@@ -259,8 +261,8 @@ static void write_list_json(dbindex *db, struct obstack *io, int listid, int seq
 }
 
 static void write_search_json(dbindex *db, struct obstack *io, const char *query) {
-       dbfile *results[50];
-       int len = dbfile_search(db, query, results, 50);
+       dbfile *results[MAX_SEARCH_RESULTS];
+       int len = dbfile_search(db, query, results, MAX_SEARCH_RESULTS);
 
        obstack_1grow(io, '{');