From bd0d0ad0ded2d68a3d9267e28a1bb5d8501301b6 Mon Sep 17 00:00:00 2001 From: Hussain Nagaria Date: Wed, 26 May 2021 20:26:34 +0530 Subject: [PATCH] feat: Add decorator for redisearch --- .../e_commerce_settings.json | 20 +++++++++++-- erpnext/e_commerce/website_item_indexing.py | 30 ++++++++++++++++++- 2 files changed, 47 insertions(+), 3 deletions(-) diff --git a/erpnext/e_commerce/doctype/e_commerce_settings/e_commerce_settings.json b/erpnext/e_commerce/doctype/e_commerce_settings/e_commerce_settings.json index 36177ff8f9..94560eb482 100644 --- a/erpnext/e_commerce/doctype/e_commerce_settings/e_commerce_settings.json +++ b/erpnext/e_commerce/doctype/e_commerce_settings/e_commerce_settings.json @@ -48,7 +48,9 @@ "item_search_settings_section", "search_index_fields", "show_categories_in_search_autocomplete", - "show_brand_line" + "show_brand_line", + "is_redisearch_loaded", + "redisearch" ], "fields": [ { @@ -328,12 +330,26 @@ "fieldname": "show_brand_line", "fieldtype": "Check", "label": "Show Brand Line" + }, + { + "default": "0", + "fieldname": "is_redisearch_loaded", + "fieldtype": "Check", + "hidden": 1, + "label": "Is Redisearch Loaded" + }, + { + "depends_on": "eval:doc.is_search_module_loaded", + "fieldname": "redisearch", + "fieldtype": "Heading", + "label": "Redisearch", + "options": "Some heading" } ], "index_web_pages_for_search": 1, "issingle": 1, "links": [], - "modified": "2021-05-05 13:41:11.483232", + "modified": "2021-05-26 20:00:35.399936", "modified_by": "Administrator", "module": "E-commerce", "name": "E Commerce Settings", diff --git a/erpnext/e_commerce/website_item_indexing.py b/erpnext/e_commerce/website_item_indexing.py index 134939cdbb..3b82a32439 100644 --- a/erpnext/e_commerce/website_item_indexing.py +++ b/erpnext/e_commerce/website_item_indexing.py @@ -10,6 +10,26 @@ from redisearch import ( TextField, TagField ) +def is_search_module_loaded(): + cache = frappe.cache() + out = cache.execute_command('MODULE LIST') + + parsed_output = " ".join( + (" ".join([s.decode() for s in o if not isinstance(s, int)]) for o in out) + ) + + return "search" in parsed_output + +# Decorator for checking wether Redisearch is there or not +def redisearch_decorator(function): + def wrapper(*args, **kwargs): + if is_search_module_loaded(): + func = function(*args, **kwargs) + return func + return + + return wrapper + def make_key(key): return "{0}|{1}".format(frappe.conf.db_name, key).encode('utf-8') @@ -28,6 +48,7 @@ ALLOWED_INDEXABLE_FIELDS_SET = { 'web_long_description' } +@redisearch_decorator def create_website_items_index(): '''Creates Index Definition''' # CREATE index @@ -67,6 +88,7 @@ def to_search_field(field): return TextField(field) +@redisearch_decorator def insert_item_to_index(website_item_doc): # Insert item to index key = get_cache_key(website_item_doc.name) @@ -78,6 +100,7 @@ def insert_item_to_index(website_item_doc): insert_to_name_ac(website_item_doc.web_item_name, website_item_doc.name) +@redisearch_decorator def insert_to_name_ac(web_name, doc_name): ac = AutoCompleter(make_key(WEBSITE_ITEM_NAME_AUTOCOMPLETE), conn=frappe.cache()) ac.add_suggestions(Suggestion(web_name, payload=doc_name)) @@ -91,12 +114,14 @@ def create_web_item_map(website_item_doc): web_item[f] = website_item_doc.get(f) or '' return web_item - + +@redisearch_decorator def update_index_for_item(website_item_doc): # Reinsert to Cache insert_item_to_index(website_item_doc) define_autocomplete_dictionary() +@redisearch_decorator def delete_item_from_index(website_item_doc): r = frappe.cache() key = get_cache_key(website_item_doc.name) @@ -110,12 +135,14 @@ def delete_item_from_index(website_item_doc): return True +@redisearch_decorator def delete_from_ac_dict(website_item_doc): '''Removes this items's name from autocomplete dictionary''' r = frappe.cache() name_ac = AutoCompleter(make_key(WEBSITE_ITEM_NAME_AUTOCOMPLETE), conn=r) name_ac.delete(website_item_doc.web_item_name) +@redisearch_decorator def define_autocomplete_dictionary(): """Creates an autocomplete search dictionary for `name`. Also creats autocomplete dictionary for `categories` if @@ -150,6 +177,7 @@ def define_autocomplete_dictionary(): return True +@redisearch_decorator def reindex_all_web_items(): items = frappe.get_all( 'Website Item',