Skip to content

Commit a4af68f

Browse files
committed
RDBC-436 Expose get_metadata_for in the API
RDBC-437 Allow to query on datetime instances natively
1 parent fd35273 commit a4af68f

File tree

5 files changed

+54
-7
lines changed

5 files changed

+54
-7
lines changed

pyravendb/data/document_conventions.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,9 +80,17 @@ def default_transform_type_tag_name(name):
8080
def build_default_metadata(entity):
8181
if entity is None:
8282
return {}
83-
return {"@collection": DocumentConventions.default_transform_plural(entity.__class__.__name__),
83+
existing = entity.__dict__.get('@metadata')
84+
if existing is None:
85+
existing = {}
86+
87+
new_metadata = {"@collection": DocumentConventions.default_transform_plural(entity.__class__.__name__),
8488
"Raven-Python-Type": "{0}.{1}".format(entity.__class__.__module__, entity.__class__.__name__)}
8589

90+
existing.update(new_metadata)
91+
92+
return existing
93+
8694
@staticmethod
8795
def try_get_type_from_metadata(metadata):
8896
if "Raven-Python-Type" in metadata:

pyravendb/store/document_session.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -479,6 +479,9 @@ def attachment(self):
479479
self._attachment = _Attachment(self.session)
480480
return self._attachment
481481

482+
def get_metadata_for(self, entity):
483+
return self.session.documents_by_entity[entity]['metadata']
484+
482485
def stream(self, query):
483486
from pyravendb.store.stream import IncrementalJsonParser
484487
import ijson

pyravendb/store/session_query.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from pyravendb.commands.raven_commands import GetFacetsCommand
44
from pyravendb.data.query import IndexQuery, QueryOperator, OrderingType, FacetQuery
55
from pyravendb.tools.utils import Utils
6-
from datetime import timedelta
6+
from datetime import timedelta, datetime
77
import time
88
import re
99

@@ -350,6 +350,13 @@ def negate_if_needed(self, field_name):
350350
self._where_tokens.append(_Token(write="NOT"))
351351

352352
def add_query_parameter(self, value):
353+
354+
if isinstance(value, timedelta):
355+
value = Utils.timedelta_tick(value)
356+
elif isinstance(value, datetime):
357+
value = Utils.datetime_to_string(value)
358+
359+
353360
parameter_name = "p{0}".format(len(self.query_parameters))
354361
self.query_parameters[parameter_name] = value
355362
return parameter_name
@@ -557,11 +564,6 @@ def where_between(self, field_name, start, end, exact=False):
557564
self._add_operator_if_needed()
558565
self.negate_if_needed(field_name)
559566

560-
if isinstance(start, timedelta):
561-
start = Utils.timedelta_tick(start)
562-
if isinstance(end, timedelta):
563-
end = Utils.timedelta_tick(end)
564-
565567
from_parameter_name = self.add_query_parameter("*" if start is None else start)
566568
to_parameter_name = self.add_query_parameter("NULL" if end is None else end)
567569

pyravendb/tests/session_tests/test_query.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
from datetime import datetime
2+
13
from pyravendb.tests.test_base import TestBase
24
from pyravendb.raven_operations.maintenance_operations import PutIndexesOperation
35
from pyravendb.custom_exceptions import exceptions
@@ -76,6 +78,14 @@ def test_can_use_exists_field(self):
7678
with self.store.open_session() as session:
7779
list(session.query(collection_name="Products").where_exists("name"))
7880

81+
def test_can_query_on_date_time(self):
82+
with self.store.open_session() as session:
83+
list(session.query(collection_name="Products").where_equals("at", datetime.now()))
84+
85+
def test_can_query_on_date_time_range(self):
86+
with self.store.open_session() as session:
87+
list(session.query(collection_name="Products").where_between("at", datetime.now(), datetime.now()))
88+
7989
def test_where_not_equal(self):
8090
with self.store.open_session() as session:
8191
query_results = list(session.query(collection_name="Products").where_not_equals("name", "test101"))

pyravendb/tests/session_tests/test_store_entities.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,30 @@ def test_store_without_key(self):
2727
with self.store.open_session() as session:
2828
self.assertIsNotNone(session.load("foos/1-A"))
2929

30+
def test_store_with_metadata_on_dict(self):
31+
foo = Foo("test", 10)
32+
foo.__dict__['@metadata'] = {'foo': True}
33+
with self.store.open_session() as session:
34+
session.store(foo)
35+
session.save_changes()
36+
37+
with self.store.open_session() as session:
38+
f = session.load("foos/1-A")
39+
metadata = session.advanced.get_metadata_for(f)
40+
self.assertTrue(metadata['foo'])
41+
42+
def test_store_with_metadata_on_api(self):
43+
foo = Foo("test", 10)
44+
with self.store.open_session() as session:
45+
session.store(foo)
46+
session.advanced.get_metadata_for(foo)['foo'] = False
47+
session.save_changes()
48+
49+
with self.store.open_session() as session:
50+
f = session.load("foos/1-A")
51+
metadata = session.advanced.get_metadata_for(f)
52+
self.assertFalse(metadata['foo'])
53+
3054
def test_store_with_key(self):
3155
foo = Foo("test", 20)
3256
with self.store.open_session() as session:

0 commit comments

Comments
 (0)