Skip to content

Commit 9c64aa9

Browse files
authored
Merge pull request #11312 from cdrini/refactor/subject-engine
Label more solr queries for monitoring + some SubjectEngine, QueryLabel refactoring
2 parents 844c537 + 9a0968b commit 9c64aa9

File tree

9 files changed

+138
-108
lines changed

9 files changed

+138
-108
lines changed

openlibrary/macros/RawQueryCarousel.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@
6060
if has_fulltext_only:
6161
params['has_fulltext'] = 'true'
6262

63-
results = work_search(params, fields = ",".join(fields), sort=sort, limit=limit, facet=False, query_label='BOOK_CAROUSEL')
63+
results = work_search(params, fields = ",".join(fields), sort=sort, limit=limit, facet=False, request_label='BOOK_CAROUSEL')
6464
books = [storage(b) for b in (results.get('docs', []))]
6565
load_more = {
6666
"queryType": "SEARCH",

openlibrary/plugins/openlibrary/partials.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,7 @@ def generate(self) -> dict:
239239
rows=0,
240240
spellcheck_count=3,
241241
facet=True,
242-
query_label='BOOK_SEARCH_FACETS',
242+
request_label='BOOK_SEARCH_FACETS',
243243
)
244244

245245
sidebar = render_template(

openlibrary/plugins/upstream/models.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -528,6 +528,7 @@ def get_books(self, q=''):
528528
has_fulltext=i.mode == "ebooks",
529529
query=q,
530530
facet=True,
531+
request_label='AUTHOR_BOOKS_PAGE',
531532
)
532533

533534
def get_work_count(self):
@@ -603,7 +604,7 @@ def _solr_data(self):
603604
solr = get_solr()
604605
stats.begin("solr", get=self.key, fields=fields)
605606
try:
606-
return solr.get(self.key, fields=fields)
607+
return solr.get(self.key, fields=fields, request_label='GET_WORK_SOLR_DATA')
607608
except Exception:
608609
logging.getLogger("openlibrary").exception("Failed to get solr data")
609610
return None

openlibrary/plugins/worksearch/code.py

Lines changed: 23 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
from openlibrary.utils.solr import (
4646
DEFAULT_PASS_TIME_ALLOWED,
4747
DEFAULT_SOLR_TIMEOUT_SECONDS,
48+
SolrRequestLabel,
4849
)
4950

5051
logger = logging.getLogger("openlibrary.worksearch")
@@ -195,24 +196,6 @@ def read_cookie():
195196
return 'details'
196197

197198

198-
QueryLabel = Literal[
199-
'UNLABELLED',
200-
'BOOK_SEARCH',
201-
'BOOK_SEARCH_API',
202-
'BOOK_SEARCH_FACETS',
203-
'BOOK_CAROUSEL',
204-
# Used for the internal request made by solr to choose the best edition
205-
# during a normal book search
206-
'EDITION_MATCH',
207-
'LIST_SEARCH',
208-
'LIST_SEARCH_API',
209-
'SUBJECT_SEARCH',
210-
'SUBJECT_SEARCH_API',
211-
'AUTHOR_SEARCH',
212-
'AUTHOR_SEARCH_API',
213-
]
214-
215-
216199
def run_solr_query( # noqa: PLR0912
217200
scheme: SearchScheme,
218201
param: dict | None = None,
@@ -225,7 +208,7 @@ def run_solr_query( # noqa: PLR0912
225208
facet: bool | Iterable[str] = True,
226209
allowed_filter_params: set[str] | None = None,
227210
extra_params: list[tuple[str, Any]] | None = None,
228-
query_label: QueryLabel = 'UNLABELLED',
211+
request_label: SolrRequestLabel = 'UNLABELLED',
229212
):
230213
"""
231214
:param param: dict of query parameters
@@ -245,7 +228,7 @@ def run_solr_query( # noqa: PLR0912
245228
*(('fq', subquery) for subquery in scheme.universe),
246229
('start', offset),
247230
('rows', rows),
248-
('ol.label', query_label),
231+
('ol.label', request_label),
249232
('wt', param.get('wt', 'json')),
250233
] + (extra_params or [])
251234

@@ -388,7 +371,7 @@ def do_search(
388371
rows=100,
389372
facet=False,
390373
spellcheck_count=None,
391-
query_label: QueryLabel = 'UNLABELLED',
374+
request_label: SolrRequestLabel = 'UNLABELLED',
392375
):
393376
"""
394377
:param param: dict of search url parameters
@@ -419,7 +402,7 @@ def do_search(
419402
spellcheck_count,
420403
fields=list(fields),
421404
facet=facet,
422-
query_label=query_label,
405+
request_label=request_label,
423406
)
424407

425408

@@ -619,7 +602,7 @@ def GET(self):
619602
page,
620603
rows=rows,
621604
spellcheck_count=3,
622-
query_label='BOOK_SEARCH',
605+
request_label='BOOK_SEARCH',
623606
)
624607
else:
625608
search_response = SearchResponse(
@@ -643,6 +626,7 @@ def works_by_author(
643626
facet=False,
644627
has_fulltext=False,
645628
query: str | None = None,
629+
request_label: SolrRequestLabel = 'UNLABELLED',
646630
):
647631
param = {'q': query or '*:*'}
648632
if has_fulltext:
@@ -663,6 +647,7 @@ def works_by_author(
663647
"time_facet",
664648
]
665649
),
650+
request_label=request_label,
666651
fields=list(
667652
WorkSearchScheme.default_fetched_fields | {'editions', 'providers'}
668653
),
@@ -750,7 +735,7 @@ def GET(self): # referenced subject_search
750735
def get_results(
751736
self,
752737
req: ListSearchRequest,
753-
query_label: Literal['LIST_SEARCH', 'LIST_SEARCH_API'],
738+
request_label: Literal['LIST_SEARCH', 'LIST_SEARCH_API'],
754739
):
755740
return run_solr_query(
756741
ListSearchScheme(),
@@ -759,7 +744,7 @@ def get_results(
759744
rows=req.limit,
760745
fields=req.fields,
761746
sort=req.sort,
762-
query_label=query_label,
747+
request_label=request_label,
763748
)
764749

765750

@@ -808,13 +793,15 @@ class subject_search(delegate.page):
808793
path = '/search/subjects'
809794

810795
def GET(self):
811-
get_results = functools.partial(self.get_results, query_label='SUBJECT_SEARCH')
796+
get_results = functools.partial(
797+
self.get_results, request_label='SUBJECT_SEARCH'
798+
)
812799
return render_template('search/subjects', get_results)
813800

814801
def get_results(
815802
self,
816803
q,
817-
query_label: Literal['SUBJECT_SEARCH', 'SUBJECT_SEARCH_API'],
804+
request_label: Literal['SUBJECT_SEARCH', 'SUBJECT_SEARCH_API'],
818805
offset=0,
819806
limit=100,
820807
):
@@ -824,7 +811,7 @@ def get_results(
824811
offset=offset,
825812
rows=limit,
826813
sort='work_count desc',
827-
query_label=query_label,
814+
request_label=request_label,
828815
)
829816

830817
return response
@@ -842,7 +829,7 @@ def GET(self):
842829

843830
response = self.get_results(
844831
i.q,
845-
query_label='SUBJECT_SEARCH_API',
832+
request_label='SUBJECT_SEARCH_API',
846833
offset=offset,
847834
limit=limit,
848835
)
@@ -861,13 +848,13 @@ class author_search(delegate.page):
861848
path = '/search/authors'
862849

863850
def GET(self):
864-
get_results = functools.partial(self.get_results, query_label='AUTHOR_SEARCH')
851+
get_results = functools.partial(self.get_results, request_label='AUTHOR_SEARCH')
865852
return render_template('search/authors', get_results)
866853

867854
def get_results(
868855
self,
869856
q,
870-
query_label: Literal['AUTHOR_SEARCH', 'AUTHOR_SEARCH_API'],
857+
request_label: Literal['AUTHOR_SEARCH', 'AUTHOR_SEARCH_API'],
871858
offset=0,
872859
limit=100,
873860
fields='*',
@@ -880,7 +867,7 @@ def get_results(
880867
rows=limit,
881868
fields=fields,
882869
sort=sort,
883-
query_label=query_label,
870+
request_label=request_label,
884871
)
885872

886873
return resp
@@ -898,7 +885,7 @@ def GET(self):
898885

899886
response = self.get_results(
900887
i.q,
901-
query_label='AUTHOR_SEARCH_API',
888+
request_label='AUTHOR_SEARCH_API',
902889
offset=offset,
903890
limit=limit,
904891
fields=i.fields,
@@ -968,7 +955,7 @@ def work_search(
968955
fields: str = '*',
969956
facet: bool = True,
970957
spellcheck_count: int | None = None,
971-
query_label: QueryLabel = 'UNLABELLED',
958+
request_label: SolrRequestLabel = 'UNLABELLED',
972959
) -> dict:
973960
"""
974961
:param sort: key of SORTS dict at the top of this file
@@ -991,7 +978,7 @@ def work_search(
991978
fields=fields,
992979
facet=facet,
993980
spellcheck_count=spellcheck_count,
994-
query_label=query_label,
981+
request_label=request_label,
995982
)
996983
response = resp.raw_resp['response']
997984

@@ -1065,7 +1052,7 @@ def GET(self):
10651052
# so disable it. This makes it much faster.
10661053
facet=False,
10671054
spellcheck_count=spellcheck_count,
1068-
query_label='BOOK_SEARCH_API',
1055+
request_label='BOOK_SEARCH_API',
10691056
)
10701057
response['documentation_url'] = "https://openlibrary.org/dev/docs/api/search"
10711058
response['q'] = q

openlibrary/plugins/worksearch/languages.py

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22

33
import json
44
import logging
5-
from typing import Literal
5+
from dataclasses import dataclass
6+
from typing import Literal, override
67

78
import web
89

@@ -140,7 +141,15 @@ def process(p):
140141
return [process(p) for p in language_facets]
141142

142143

144+
@dataclass
143145
class LanguageEngine(subjects.SubjectEngine):
146+
name: str = "language"
147+
key: str = "languages"
148+
prefix: str = "/languages/"
149+
facet: str = "language"
150+
facet_key: str = "language"
151+
152+
@override
144153
def normalize_key(self, key):
145154
return key
146155

@@ -160,13 +169,4 @@ def get_ebook_count(self, name, value, publish_year):
160169

161170

162171
def setup():
163-
subjects.SUBJECTS.append(
164-
subjects.SubjectMeta(
165-
name="language",
166-
key="languages",
167-
prefix="/languages/",
168-
facet="language",
169-
facet_key="language",
170-
Engine=LanguageEngine,
171-
)
172-
)
172+
subjects.SUBJECTS.append(LanguageEngine())

openlibrary/plugins/worksearch/publishers.py

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
"""Publisher pages"""
22

33
import logging
4+
from dataclasses import dataclass
5+
from typing import override
46

57
import web
68

@@ -17,7 +19,11 @@ class publishers(subjects.subjects):
1719

1820
def GET(self, key):
1921
key = key.replace("_", " ")
20-
page = subjects.get_subject(key, details=True)
22+
page = subjects.get_subject(
23+
key,
24+
details=True,
25+
request_label='SUBJECT_ENGINE_PAGE',
26+
)
2127

2228
if not page or page.work_count == 0:
2329
web.ctx.status = "404 Not Found"
@@ -82,7 +88,15 @@ def process_result(self, result):
8288
]
8389

8490

91+
@dataclass
8592
class PublisherEngine(subjects.SubjectEngine):
93+
name: str = "publisher"
94+
key: str = "publishers"
95+
prefix: str = "/publishers/"
96+
facet: str = "publisher_facet"
97+
facet_key: str = "publisher_facet"
98+
99+
@override
86100
def normalize_key(self, key):
87101
return key
88102

@@ -102,13 +116,4 @@ def get_ebook_count(self, name, value, publish_year):
102116

103117

104118
def setup():
105-
subjects.SUBJECTS.append(
106-
subjects.SubjectMeta(
107-
name="publisher",
108-
key="publishers",
109-
prefix="/publishers/",
110-
facet="publisher_facet",
111-
facet_key="publisher_facet",
112-
Engine=PublisherEngine,
113-
)
114-
)
119+
subjects.SUBJECTS.append(PublisherEngine())

0 commit comments

Comments
 (0)