Query proxy that allows the usage of AtlasSearch with mongoengine specific syntax
Project description
AtlasQ
AtlasQ allows the usage of AtlasSearch keeping the MongoEngine syntax.
Structure
The package tries to follow the MongoEngine structure;
the major differences reside in the transform.py
and queryset.py
files.
Transform
Like in MongoEngine, a step in the pipeline is the creation of a query from a Q
object:
we have to find a correspondence between the MongoEngine common syntax and what AtlasSearch allows.
For doing this, we had to find some compromises.
Not every keyword is supported at the moment: if you have an actual use case that you would like to support, please be free to open an issue or a PR at any moment.
QuerySet
There are probably a thousand of better implementation, if you actually knew MongoEngine and above all PyMongo. Unfortunately, our knowledge is limited, so here we go. If you find a solution that works better, again, feel free to open an issue or a PR.
The main idea, is that the filter
should work like an aggregation
.
For doing so, and with keeping the compatibility on how MongoEngine works (i.e. the filter should return a queryset of Document
) we had to do some work.
Calling .aggregate
instead has to work as MongoEngine expect, meaning a list of dictionaries.
Features
Validation
We also decided to have, optionally, a validation of the index. Two things are checked:
- The index actually exists (If you query a non-existing index, Atlas as default behaviour will not raise any error).
- The fields that you are querying are actually indexed(If you query a field that is not indexed, Atlas as default behaviour will not raise any error, and will return an empty list).
To make these check, you need to call the function
ensure_index
on the queryset:
Usage
Now the most important part: how do you use this package?
from mongoengine import Document, fields
from atlasq import AtlasManager, AtlasQ, AtlasQuerySet
index_name = str("my_index")
class MyDocument(Document):
name = fields.StringField(required=True)
surname = fields.StringField(required=True)
atlas = AtlasManager(index_name)
obj = MyDocument.objects.create(name="value", surname="value2")
qs = MyDocument.atlas.filter(name="value")
assert isinstance(qs, AtlasQuerySet)
obj_from_atlas = qs.first()
assert obj == obj_from_atlas
obj2_from_atlas = MyDocument.atlas.get(AtlasQ(name="value") & AtlasQ(surname="value2"))
assert obj == obj2_from_atlas
obj3_from_atlas = MyDocument.atlas.get(AtlasQ(wrong_field="value"))
assert obj3_from_atlas is None
result = MyDocument.atlas.ensure_index("user", "pwd", "group", "cluster")
assert result is True
obj3_from_atlas = MyDocument.atlas.get(AtlasQ(wrong_field="value")) # raises AtlasIndexFieldError
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file atlasq-0.2.7.tar.gz
.
File metadata
- Download URL: atlasq-0.2.7.tar.gz
- Upload date:
- Size: 18.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.1 CPython/3.9.13
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 3038a2bebcbe29c7adfbda7aa8554a3966106723566ea56ebf2ffe9aabfafc8b |
|
MD5 | 34d6e34ae943cd65d37e24ab460eb590 |
|
BLAKE2b-256 | bf96f474ad38c6e10c63716900eb8ba91969ab5bc7de493b4e1799f699dce300 |
File details
Details for the file atlasq-0.2.7-py3-none-any.whl
.
File metadata
- Download URL: atlasq-0.2.7-py3-none-any.whl
- Upload date:
- Size: 22.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.1 CPython/3.9.13
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 8a7f9f719249a991cb2237db1ee0742bfe2c3088d4e1066636aecb39c26dd91a |
|
MD5 | 7cc181b63e250205d809e5d1f3651910 |
|
BLAKE2b-256 | 2523b9b1081aee897b1612ce1dc85a04120712c6a302c92d858998b2ef3f6d20 |