Skip to content

Commit

Permalink
Create custom serializer to handle set() index data
Browse files Browse the repository at this point in the history
  • Loading branch information
instification committed Oct 4, 2024
1 parent 686e6a7 commit ee387a4
Show file tree
Hide file tree
Showing 3 changed files with 14 additions and 4 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@

- Add support for optional es host in worker via PLONE_ELASTICSEARCH_HOST env variable @maethu

- Serialize to list when indexed data contains sets @instification


## 5.0.0 (2022-10-11)

Expand Down
12 changes: 10 additions & 2 deletions src/collective/elasticsearch/manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
from collective.elasticsearch.result import ElasticResult
from collective.elasticsearch.utils import use_redis
from DateTime import DateTime
from elasticsearch import Elasticsearch
from elasticsearch import Elasticsearch, JSONSerializer
from elasticsearch import exceptions
from elasticsearch.exceptions import NotFoundError
from plone import api
Expand All @@ -26,6 +26,14 @@
CUSTOM_INDEX_NAME_ATTR = "_elasticcustomindex"
INDEX_VERSION_ATTR = "_elasticindexversion"

# Custom serializer to handle cases where set() data is passed to an index
class PloneJSONSerializer(JSONSerializer):

def default(self, data):
if isinstance(data, set):
return [i for i in data]
super().default(data)


@implementer(interfaces.IElasticSearchManager)
class ElasticSearchManager:
Expand Down Expand Up @@ -288,7 +296,7 @@ def connection(self) -> Elasticsearch:
conn = local.get_local(self.connection_key)
if not conn:
hosts, params = utils.get_connection_settings()
local.set_local(self.connection_key, Elasticsearch(hosts, **params))
local.set_local(self.connection_key, Elasticsearch(hosts, serializer=PloneJSONSerializer(), **params))
conn = local.get_local(self.connection_key)
return conn

Expand Down
4 changes: 2 additions & 2 deletions src/collective/elasticsearch/redis/tasks.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from .fetch import fetch_blob_data
from .fetch import fetch_data
from collective.elasticsearch import local
from collective.elasticsearch.manager import ElasticSearchManager
from collective.elasticsearch.manager import ElasticSearchManager, PloneJSONSerializer
from elasticsearch import Elasticsearch
from rq import Queue
from rq import Retry
Expand Down Expand Up @@ -30,7 +30,7 @@ def es_connection(hosts, **params):
connection = local.get_local(ElasticSearchManager.connection_key)
if not connection:
local.set_local(
ElasticSearchManager.connection_key, Elasticsearch(hosts, **params)
ElasticSearchManager.connection_key, Elasticsearch(hosts, serializer=PloneJSONSerializer(), **params)
)
connection = local.get_local(ElasticSearchManager.connection_key)
return connection
Expand Down

0 comments on commit ee387a4

Please sign in to comment.