feat: Add decorator for redisearch

This commit is contained in:
Hussain Nagaria 2021-05-26 20:26:34 +05:30 committed by marination
parent b29c5d6e84
commit bd0d0ad0de
2 changed files with 47 additions and 3 deletions

View File

@ -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",

View File

@ -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',