Skip to content

Commit

Permalink
Removed SearchPayload model and udpated all the functions in search i…
Browse files Browse the repository at this point in the history
…nterface to return List[SearchItem], Enhanced typing covered in the PR reviews
  • Loading branch information
punith300i committed Jun 6, 2023
1 parent 685f596 commit 168de5e
Show file tree
Hide file tree
Showing 4 changed files with 30 additions and 39 deletions.
26 changes: 13 additions & 13 deletions sand/controllers/search.py
Original file line number Diff line number Diff line change
@@ -1,21 +1,21 @@
import threading
from typing import Dict, List, Union
from typing import Dict, List, Union, Literal
from flask.blueprints import Blueprint
from sm.misc.funcs import import_func
from sand.config import SETTINGS
from flask import request, jsonify

from sand.extension_interface.search import IEntitySearch, IOntologySearch
from sand.models.search import SearchPayload
from sand.models.search import SearchItem
from gena.serializer import get_dataclass_serializer

search_bp = Blueprint("search", "search")

GetSearchCache = threading.local()
serializer = get_dataclass_serializer(SearchPayload)
serializer = get_dataclass_serializer(SearchItem)


def get_search(name) -> Union[IEntitySearch, IOntologySearch]:
def get_search(name: Literal['classes', 'entities', 'props']) -> Union[IEntitySearch, IOntologySearch]:
"""
Returns an implementation of an ISearch Interface from the
configuration file.
Expand All @@ -36,26 +36,26 @@ def search_classes():
"""API Route to search for classes with their names"""
search_text = request.args.get('q')
wikidata_search = get_search('classes')
search_payload = wikidata_search.find_class_by_name(search_text)
serialized_payload = serializer(search_payload)
return jsonify(serialized_payload)
search_items = wikidata_search.find_class_by_name(search_text)
serialized_payload = [serializer(item) for item in search_items]
return jsonify({'items': serialized_payload})


@search_bp.route(f"/{search_bp.name}/entities", methods=["GET"])
def search_entities():
"""API Route to search for entities with their names"""
search_text = request.args.get('q')
wikidata_search = get_search('entities')
search_payload = wikidata_search.find_entity_by_name(search_text)
serialized_payload = serializer(search_payload)
return jsonify(serialized_payload)
search_items = wikidata_search.find_entity_by_name(search_text)
serialized_payload = [serializer(item) for item in search_items]
return jsonify({'items': serialized_payload})


@search_bp.route(f"/{search_bp.name}/props", methods=["GET"])
def search_props():
"""API Route to search for properties with their names"""
search_text = request.args.get('q')
wikidata_search = get_search('props')
search_payload = wikidata_search.find_props_by_name(search_text)
serialized_payload = serializer(search_payload)
return jsonify(serialized_payload)
search_items = wikidata_search.find_props_by_name(search_text)
serialized_payload = [serializer(item) for item in search_items]
return jsonify({'items': serialized_payload})
10 changes: 5 additions & 5 deletions sand/extension_interface/search.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
from abc import ABC, abstractmethod
from typing import Dict
from sand.models.search import SearchPayload
from typing import List
from sand.models.search import SearchItem


class IEntitySearch(ABC):
""" Entity Search Interface to support searches from multiple
KG datastores.
"""
@abstractmethod
def find_entity_by_name(self, search_text: str) -> SearchPayload:
def find_entity_by_name(self, search_text: str) -> List[SearchItem]:
"""Search Entity using name"""
pass

Expand All @@ -19,11 +19,11 @@ class IOntologySearch(ABC):
"""

@abstractmethod
def find_class_by_name(self, search_text: str) -> SearchPayload:
def find_class_by_name(self, search_text: str) -> List[SearchItem]:
"""Search Class using name"""
pass

@abstractmethod
def find_props_by_name(self, search_text: str) -> SearchPayload:
def find_props_by_name(self, search_text: str) -> List[SearchItem]:
"""Search properties using name"""
pass
24 changes: 12 additions & 12 deletions sand/extensions/search/wikidata_search.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import requests
from typing import Dict
from typing import Dict, List
import nh3
from sand.extension_interface.search import IEntitySearch, IOntologySearch
from sand.models.entity import Entity
from sand.models.ontology import OntClass, OntProperty, OntClassAR
from sand.models.search import SearchItem, SearchPayload
from sand.models.search import SearchItem


class WikidataSearch(IEntitySearch, IOntologySearch):
Expand All @@ -21,6 +21,7 @@ def __init__(self):
"srlimit": 10,
"srprop": "snippet|titlesnippet"
}
self.ont_class_ar = None

def get_class_search_params(self, search_text: str) -> Dict:
"""Updates class search parameters for wikidata API"""
Expand All @@ -31,7 +32,9 @@ def get_class_search_params(self, search_text: str) -> Dict:

def get_local_class_properties(self, id: str) -> OntClass:
"""Calls local class search API to fetch all class metadata using class ID"""
return OntClassAR()[id]
if self.ont_class_ar is None:
self.ont_class_ar = OntClassAR()
return self.ont_class_ar[id]

def get_entity_search_params(self, search_text: str) -> Dict:
"""Updates entity search parameters for wikidata API"""
Expand All @@ -47,7 +50,7 @@ def get_props_search_params(self, search_text: str) -> Dict:
props_params['srsearch'] = search_text
return props_params

def find_class_by_name(self, search_text: str) -> SearchPayload:
def find_class_by_name(self, search_text: str) -> List[SearchItem]:
"""
Uses Wikidata API to search for classes using their name/text.
Uses local ID based class search to fetch label and description data.
Expand All @@ -65,10 +68,9 @@ def find_class_by_name(self, search_text: str) -> SearchPayload:
uri=OntClass.id2uri(search_item['title'])
)
payload_items.append(item)
payload = SearchPayload(payload_items)
return payload
return payload_items

def find_entity_by_name(self, search_text: str) -> SearchPayload:
def find_entity_by_name(self, search_text: str) -> List[SearchItem]:
"""Uses Wikidata API to search for entities using their name/text."""
request_params = self.get_entity_search_params(search_text)
api_data = requests.get(self.wikidata_url, request_params)
Expand All @@ -82,10 +84,9 @@ def find_entity_by_name(self, search_text: str) -> SearchPayload:
uri=Entity.id2uri(search_item['title'])
)
payload_items.append(item)
payload = SearchPayload(payload_items)
return payload
return payload_items

def find_props_by_name(self, search_text: str) -> SearchPayload:
def find_props_by_name(self, search_text: str) -> List[SearchItem]:
"""Uses Wikidata API to search for properties using their name/text."""
request_params = self.get_props_search_params(search_text)
api_data = requests.get(self.wikidata_url, request_params)
Expand All @@ -99,5 +100,4 @@ def find_props_by_name(self, search_text: str) -> SearchPayload:
uri=OntProperty.id2uri(search_item['title'].split(":")[1])
)
payload_items.append(item)
payload = SearchPayload(payload_items)
return payload
return payload_items
9 changes: 0 additions & 9 deletions sand/models/search.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
from dataclasses import dataclass
from typing import List
from gena.serializer import get_dataclass_serializer


@dataclass
Expand All @@ -13,11 +12,3 @@ class SearchItem:
description: str
uri: str


@dataclass
class SearchPayload:
"""
Search Payload dataclass to hold several search items
"""
items: List[SearchItem]

0 comments on commit 168de5e

Please sign in to comment.