From 982ea41ff0c1975bb061684693ccdf84c164594a Mon Sep 17 00:00:00 2001
From: Alexandra Rogova <alexandra.rogova.pro@gmail.com>
Date: Wed, 29 May 2019 15:45:32 +0200
Subject: [PATCH] implemented elasticlunr, search is now much faster!

---
 gadget_model.html |  3 +++
 gadget_model.js   | 52 +++++++++++++++++++++++++++++++++++++----------
 gadget_result.js  |  2 +-
 search.html       |  3 +++
 search.js         | 33 +++++++++++-------------------
 5 files changed, 60 insertions(+), 33 deletions(-)

diff --git a/gadget_model.html b/gadget_model.html
index 2a6c022..8c2e136 100644
--- a/gadget_model.html
+++ b/gadget_model.html
@@ -5,6 +5,9 @@
 <script src="../jio/external/rsvp-2.0.4.js"></script>
   <script src="../jio/dist/jio-latest.js"></script>
   <script src="../renderjs/dist/renderjs-latest.js"></script>
+  <script src="./elasticlunr/elasticlunr.js"></script>
+  <script src="./lunr-languages/lunr.stemmer.support.js"></script>
+  <script src="./lunr-languages/lunr.fr.js"></script>
  <script src="gadget_model.js"></script>
  </head>
  <body>
diff --git a/gadget_model.js b/gadget_model.js
index 39945d6..83191c1 100644
--- a/gadget_model.js
+++ b/gadget_model.js
@@ -5,6 +5,14 @@
  rJS(window)
 
  .ready(function(){
+   
+   this.index = elasticlunr(function () {
+    this.use(elasticlunr.fr);
+    this.addField('title');
+    this.addField('body');
+    this.addField('link');
+    this.setRef('id'); //id = x."/a/b" where x = substorage id, "/a/b" = item id in x  
+  });
 
    this.feeds = jIO.createJIO({
       type : "indexeddb",
@@ -22,21 +30,43 @@
  })
  
  .declareMethod ("add_attachment", function (title, rss){
-   var gadget = this;
+   var gadget = this, sub_id;
     return this.feeds.putAttachment("feeds_doc", title, new Blob([rss], {type : "text/xml"}))
       .push(function (){
         var new_sub_storage = {
-          type : "my_parser",
-          document_id : "feeds_doc",
-          attachment_id : title,
-          parser : "rss",
-          sub_storage : {
-            type : "indexeddb",
-            database : "mynij-v1.2"
-          }
-        };
+              type : "my_parser",
+              document_id : "feeds_doc",
+              attachment_id : title,
+              parser : "rss",
+              sub_storage : {
+                type : "indexeddb",
+                database : "mynij-v1.2"
+              }
+            };
         var tmp = jIO.createJIO(new_sub_storage);
         gadget.sub_storages.push(tmp);
+        sub_id = gadget.sub_storages.length-1;
+        return gadget.sub_storages[sub_id].allDocs();
+      })
+      .push(function(all_new_items){
+        var i, promise_list = [];
+        for (i = 0; i<all_new_items.data.rows.length; i+=1){
+          promise_list.push(gadget.sub_storages[sub_id].get(all_new_items.data.rows[i].id));
+        }
+        return RSVP.all(promise_list);
+      })
+      .push(function(items){
+        var i, id, doc;
+        for (i=1; i<items.length; i++){
+          id = sub_id+"./0/"+i;
+          doc = {
+            "id": id,
+            "title": items[i].title,
+            "body": items[i].description,
+            "link": items[i].link
+          };
+          gadget.index.addDoc(doc);
+        }
       });
  })
  
@@ -54,7 +84,7 @@
  })
 
  .declareMethod("search", function() {
-    return this.search_storage.allDocs.apply(this.search_storage, arguments);
+   return this.index.search(arguments[0]);
  })
 
  .declareMethod("loaded_doc", function(){
diff --git a/gadget_result.js b/gadget_result.js
index cd8ff7a..f357012 100644
--- a/gadget_result.js
+++ b/gadget_result.js
@@ -37,7 +37,7 @@
         body.innerHTML = "";
         list.appendChild(list_item);
       } else {
-        return this.cut_description(item.description, key)
+        return this.cut_description(item.body, key)
         .push(function (result){
           if (result === null) body.innerHTML = "";
           else body.innerHTML = result.slice(1);
diff --git a/search.html b/search.html
index 5e8c7d9..cbe46f1 100644
--- a/search.html
+++ b/search.html
@@ -6,6 +6,9 @@
   <script src="../jio/dist/jio-latest.js"></script>
   <script src="jio.my_parser_storage.js"></script>
   <script src="../renderjs/dist/renderjs-latest.js"></script>
+  <script src="./elasticlunr/elasticlunr.js"></script>
+  <script src="./lunr-languages/lunr.stemmer.support.js"></script>
+  <script src="./lunr-languages/lunr.fr.js"></script>
   <script src="search.js"></script>
   <link rel="stylesheet" type="text/css" href="mynij.css">
 </head>
diff --git a/search.js b/search.js
index c14fe20..d8b82fb 100644
--- a/search.js
+++ b/search.js
@@ -69,30 +69,21 @@
     var gadget = this;
     return gadget.state.result_gadget.clear()
       .push(function(){
-        return gadget.state.model_gadget.allDocs();
+        return gadget.state.model_gadget.search(key);
       })
-      .push(function (all_attachments){
-        var i, j, promise_list = [];
-        for (i=0; i<all_attachments.length; i+=1){
-          for (j=1; j<all_attachments[i].data.rows.length; j+=1){
-            promise_list.push(gadget.state.model_gadget.get(i, all_attachments[i].data.rows[j].id));
+      .push(function(result){
+        if (result.length === 0) {
+            return gadget.state.result_gadget.addItem({
+              title : "No results found",
+              link : ""
+            }, "");
+        } else {
+          var i, promise_list = [];
+          for (i=0; i<result.length; i+=1){
+            promise_list.push(gadget.state.result_gadget.addItem(result[i].doc, key));
           }
+          return RSVP.all(promise_list);
         }
-        return RSVP.all(promise_list);
-      }).push(function(all_items){
-        var i, 
-            regEx = new RegExp('((.* '+key+' .*)|('+key+' .*))', 'gi'),
-            promise_list = [];
-        for (i=0; i<all_items.length; i+=1){
-          if (regEx.test(all_items[i].title) || regEx.test(all_items[i].description)) promise_list.push(gadget.state.result_gadget.addItem(all_items[i], key));
-        }
-        if (promise_list.length === 0) {
-          return gadget.state.result_gadget.addItem({
-            title : "No results found",
-            link : ""
-          }, "");
-        }
-        else return RSVP.all(promise_list);
       });
   })
 
-- 
2.30.9