Skip to content

Commit ae60146

Browse files
Merge pull request #1003 from openedx/iahmad/ENT-9780
feat: added relevant sort on videos
2 parents 9875c8b + a9fcab5 commit ae60146

File tree

4 files changed

+42
-8
lines changed

4 files changed

+42
-8
lines changed

enterprise_catalog/apps/api_client/algolia.py

+19-7
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,18 @@ class AlgoliaSearchClient:
2020
ALGOLIA_APPLICATION_ID = settings.ALGOLIA.get('APPLICATION_ID')
2121
ALGOLIA_API_KEY = settings.ALGOLIA.get('API_KEY')
2222
ALGOLIA_INDEX_NAME = settings.ALGOLIA.get('INDEX_NAME')
23+
ALGOLIA_REPLICA_INDEX_NAME = settings.ALGOLIA.get('REPLICA_INDEX_NAME')
2324

2425
def __init__(self):
2526
self._client = None
2627
self.algolia_index = None
28+
self.replica_index = None
2729

2830
def init_index(self):
2931
"""
3032
Initializes an index within Algolia. Initializing an index will create it if it doesn't exist.
3133
"""
32-
if not self.ALGOLIA_INDEX_NAME:
34+
if not self.ALGOLIA_INDEX_NAME or not self.ALGOLIA_REPLICA_INDEX_NAME:
3335
logger.error('Could not initialize Algolia index due to missing index name.')
3436
return
3537

@@ -44,14 +46,15 @@ def init_index(self):
4446
self._client = SearchClient.create(self.ALGOLIA_APPLICATION_ID, self.ALGOLIA_API_KEY)
4547
try:
4648
self.algolia_index = self._client.init_index(self.ALGOLIA_INDEX_NAME)
49+
self.replica_index = self._client.init_index(self.ALGOLIA_REPLICA_INDEX_NAME)
4750
except AlgoliaException as exc:
4851
logger.exception(
4952
'Could not initialize %s index in Algolia due to an exception.',
5053
self.ALGOLIA_INDEX_NAME,
5154
)
5255
raise exc
5356

54-
def set_index_settings(self, index_settings):
57+
def set_index_settings(self, index_settings, primary_index=True):
5558
"""
5659
Set default settings to use for the Algolia index.
5760
@@ -66,7 +69,10 @@ def set_index_settings(self, index_settings):
6669
return
6770

6871
try:
69-
self.algolia_index.set_settings(index_settings)
72+
if primary_index:
73+
self.algolia_index.set_settings(index_settings)
74+
else:
75+
self.replica_index.set_settings(index_settings)
7076
except AlgoliaException as exc:
7177
logger.exception(
7278
'Unable to set settings for Algolia\'s %s index due to an exception.',
@@ -78,18 +84,24 @@ def index_exists(self):
7884
"""
7985
Returns whether the index exists in Algolia.
8086
"""
81-
if not self.algolia_index:
87+
if not self.algolia_index or not self.replica_index:
8288
logger.error('Algolia index does not exist. Did you initialize it?')
8389
return False
8490

85-
exists = self.algolia_index.exists()
86-
if not exists:
91+
primary_exists = self.algolia_index.exists()
92+
replica_exists = self.replica_index.exists()
93+
if not primary_exists:
8794
logger.warning(
8895
'Index with name %s does not exist in Algolia.',
8996
self.ALGOLIA_INDEX_NAME,
9097
)
98+
if not replica_exists:
99+
logger.warning(
100+
'Index with name %s does not exist in Algolia.',
101+
self.ALGOLIA_REPLICA_INDEX_NAME,
102+
)
91103

92-
return exists
104+
return primary_exists and replica_exists
93105

94106
def replace_all_objects(self, algolia_objects): # pragma: no cover
95107
"""

enterprise_catalog/apps/catalog/algolia_utils.py

+17
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import time
55

66
from dateutil import parser
7+
from django.conf import settings
78
from django.core.cache import cache
89
from django.db.models import Q
910
from django.utils.dateparse import parse_datetime
@@ -53,7 +54,9 @@
5354
ALGOLIA_UUID_BATCH_SIZE = 100
5455

5556
ALGOLIA_JSON_METADATA_MAX_SIZE = 100000
57+
ALGOLIA_REPLICA_INDEX_NAME = settings.ALGOLIA.get('REPLICA_INDEX_NAME')
5658

59+
algolia_replica_index = f'virtual({ALGOLIA_REPLICA_INDEX_NAME})'
5760

5861
# keep attributes from content objects that we explicitly want in Algolia
5962
ALGOLIA_FIELDS = [
@@ -183,6 +186,19 @@
183186
'desc(course_bayesian_average)',
184187
'desc(recent_enrollment_count)',
185188
],
189+
'replicas': [
190+
algolia_replica_index
191+
],
192+
}
193+
194+
ALGOLIA_REPLICA_INDEX_SETTINGS = {
195+
'customRanking': [
196+
'desc(duration)',
197+
'asc(visible_via_association)',
198+
'asc(created)',
199+
'desc(course_bayesian_average)',
200+
'desc(recent_enrollment_count)',
201+
],
186202
}
187203

188204

@@ -354,6 +370,7 @@ def configure_algolia_index(algolia_client):
354370
Configures the settings for an Algolia index.
355371
"""
356372
algolia_client.set_index_settings(ALGOLIA_INDEX_SETTINGS)
373+
algolia_client.set_index_settings(ALGOLIA_REPLICA_INDEX_SETTINGS, primary_index=False)
357374

358375

359376
def get_algolia_object_id(content_type, uuid):

enterprise_catalog/apps/catalog/tests/test_algolia_utils.py

+5-1
Original file line numberDiff line numberDiff line change
@@ -1058,7 +1058,11 @@ def test_configure_algolia_index(self, mock_search_client):
10581058
"""
10591059
algolia_client = utils.get_initialized_algolia_client()
10601060
utils.configure_algolia_index(algolia_client)
1061-
mock_search_client.return_value.set_index_settings.assert_called_once_with(utils.ALGOLIA_INDEX_SETTINGS)
1061+
mock_search_client.return_value.set_index_settings.assert_any_call(utils.ALGOLIA_INDEX_SETTINGS)
1062+
mock_search_client.return_value.set_index_settings.assert_called_with(
1063+
utils.ALGOLIA_REPLICA_INDEX_SETTINGS,
1064+
primary_index=False
1065+
)
10621066

10631067
@ddt.data(
10641068
(

enterprise_catalog/settings/base.py

+1
Original file line numberDiff line numberDiff line change
@@ -409,6 +409,7 @@
409409
# Algolia
410410
ALGOLIA = {
411411
'INDEX_NAME': '',
412+
'REPLICA_INDEX_NAME': '',
412413
'APPLICATION_ID': '',
413414
'API_KEY': '',
414415
}

0 commit comments

Comments
 (0)