Skip to content

Commit 16cac2f

Browse files
authored
Merge pull request pandas-dev#416 from manahl/bugfix/metadata_store_append_inconsistent_return
Bugfix/metadata store append inconsistent return
2 parents f7cb4da + ed3ff38 commit 16cac2f

File tree

3 files changed

+53
-12
lines changed

3 files changed

+53
-12
lines changed

CHANGES.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
* Perf: #408 Improve memory performance of version store's serializer
55
* Bugfix #394 Multi symbol read in chunkstore
66
* Bugfix: #407 Fix segment issue on appends in chunkstore
7+
* Bugfix: Inconsistent returns on MetadataStore.append
78

89
### 1.51 (2017-08-21)
910
* Bugfix: #397 Remove calls to deprecated methods in pymongo

arctic/store/metadata_store.py

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,12 @@
22
import logging
33

44
import pandas as pd
5-
65
import bson
76
import pymongo
7+
8+
from .._util import indent
89
from ..decorators import mongo_retry
910
from ..exceptions import NoDataFoundException
10-
1111
from .bson_store import BSONStore
1212

1313
logger = logging.getLogger(__name__)
@@ -44,6 +44,18 @@ def __init__(self, arctic_lib):
4444
def _reset(self):
4545
self._collection = self._arctic_lib.get_top_level_collection().metadata
4646

47+
def __getstate__(self):
48+
return {'arctic_lib': self._arctic_lib}
49+
50+
def __setstate__(self, state):
51+
return MetadataStore.__init__(self, state['arctic_lib'])
52+
53+
def __str__(self):
54+
return """<%s at %s>\n%s""" % (self.__class__.__name__, hex(id(self)), indent(str(self._arctic_lib), 4))
55+
56+
def __repr__(self):
57+
return str(self)
58+
4759
@mongo_retry
4860
def list_symbols(self):
4961
return self.distinct('symbol')
@@ -151,7 +163,7 @@ def append(self, symbol, metadata, start_time=None):
151163
raise ValueError('start_time={} is earlier than the last metadata @{}'.format(start_time,
152164
old_metadata['start_time']))
153165
if old_metadata['metadata'] == metadata:
154-
return metadata
166+
return old_metadata
155167
elif metadata is None:
156168
return
157169

@@ -189,7 +201,8 @@ def prepend(self, symbol, metadata, start_time=None):
189201
if old_metadata['metadata'] == metadata:
190202
self.find_one_and_update({'symbol': symbol}, {'$set': {'start_time': start_time}},
191203
sort=[('start_time', pymongo.ASCENDING)])
192-
return metadata
204+
old_metadata['start_time'] = start_time
205+
return old_metadata
193206
end_time = old_metadata.get('start_time')
194207
else:
195208
end_time = None

tests/integration/store/test_metadata_store.py

Lines changed: 35 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
try:
2+
import cPickle as pickle
3+
except ImportError:
4+
import pickle
15
from datetime import datetime as dt
26
import pandas as pd
37
from pandas.util.testing import assert_frame_equal
@@ -32,6 +36,16 @@ def integrity_check(ms_lib, symbol):
3236
metadata = item['metadata']
3337
assert start_time == None, 'end_time of the last entry should be unset'
3438

39+
40+
def test_pickle(ms_lib):
41+
buff = pickle.dumps(ms_lib)
42+
mnew = pickle.loads(buff)
43+
assert ms_lib._arctic_lib.get_name() == mnew._arctic_lib.get_name()
44+
45+
assert "arctic_test.TEST" in str(ms_lib)
46+
assert str(ms_lib) == repr(ms_lib)
47+
48+
3549
def test_has_symbol(ms_lib):
3650
assert not ms_lib.has_symbol(symbol1)
3751
ms_lib.append(symbol1, metadata1)
@@ -72,19 +86,25 @@ def test_write_history(ms_lib):
7286

7387

7488
def test_append(ms_lib):
75-
ms_lib.append(symbol1, None)
89+
ret1 = ms_lib.append(symbol1, None)
7690
assert not ms_lib.has_symbol(symbol1)
91+
assert ret1 is None
7792

78-
ms_lib.append(symbol1, metadata1, start_time1)
93+
ret2 = ms_lib.append(symbol1, metadata1, start_time1)
7994
assert ms_lib.read(symbol1) == metadata1
95+
assert ret2['symbol'] == symbol1
96+
assert ret2['start_time'] == start_time1
97+
assert ret2['metadata'] == metadata1
8098

8199
# ensure writing same metadata does not create new entry
82-
ms_lib.append(symbol1, metadata1, start_time2)
100+
ret3 = ms_lib.append(symbol1, metadata1, start_time2)
83101
assert ms_lib.read(symbol1) == metadata1
84102
assert_frame_equal(ms_lib.read_history(symbol1), dataframe1)
103+
assert ret3 == ret2
85104

86-
ms_lib.append(symbol1, metadata2, start_time2)
105+
ret4 = ms_lib.append(symbol1, metadata2, start_time2)
87106
assert_frame_equal(ms_lib.read_history(symbol1), dataframe3)
107+
assert ret4['metadata'] == metadata2
88108

89109
with pytest.raises(ValueError):
90110
ms_lib.append(symbol1, metadata1, start_time1)
@@ -93,19 +113,26 @@ def test_append(ms_lib):
93113

94114

95115
def test_prepend(ms_lib):
96-
ms_lib.prepend(symbol1, None)
116+
ret1 = ms_lib.prepend(symbol1, None)
97117
assert not ms_lib.has_symbol(symbol1)
118+
assert ret1 is None
98119

99-
ms_lib.prepend(symbol1, metadata2, start_time2)
120+
ret2 = ms_lib.prepend(symbol1, metadata2, start_time2)
100121
assert ms_lib.read(symbol1) == metadata2
101122
assert_frame_equal(ms_lib.read_history(symbol1), dataframe4)
123+
assert ret2['symbol'] == symbol1
124+
assert ret2['start_time'] == start_time2
125+
assert ret2['metadata'] == metadata2
102126

103-
ms_lib.prepend(symbol1, metadata1, start_time1)
127+
ret3 = ms_lib.prepend(symbol1, metadata1, start_time1)
104128
assert_frame_equal(ms_lib.read_history(symbol1), dataframe3)
129+
assert ret3['metadata'] == metadata1
105130

106131
# ensure writing same metadata does not create new entry
107-
ms_lib.prepend(symbol1, metadata1, start_time0)
132+
ret4 = ms_lib.prepend(symbol1, metadata1, start_time0)
108133
assert_frame_equal(ms_lib.read_history(symbol1), dataframe5)
134+
ret3['start_time'] = start_time0
135+
assert ret4 == ret3
109136

110137
with pytest.raises(ValueError):
111138
ms_lib.append(symbol1, metadata2, start_time2)

0 commit comments

Comments
 (0)