Skip to content

Commit 4ee70e2

Browse files
authored
Add quota to chunkstore and fix writes with missing column names (pandas-dev#261)
1 parent c041786 commit 4ee70e2

File tree

4 files changed

+61
-2
lines changed

4 files changed

+61
-2
lines changed

arctic/chunkstore/chunkstore.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from pandas import DataFrame, Series
77
from six.moves import xrange
88
from itertools import groupby
9+
from pymongo.errors import OperationFailure
910

1011
from ..decorators import mongo_retry
1112
from .._util import indent
@@ -248,6 +249,8 @@ def write(self, symbol, item, chunker=DateChunker(), **kwargs):
248249
if not isinstance(item, (DataFrame, Series)):
249250
raise Exception("Can only chunk DataFrames and Series")
250251

252+
self._arctic_lib.check_quota()
253+
251254
previous_shas = []
252255
doc = {}
253256

@@ -319,6 +322,8 @@ def __update(self, sym, item, combine_method=None, chunk_range=None):
319322
if not isinstance(item, (DataFrame, Series)):
320323
raise Exception("Can only chunk DataFrames and Series")
321324

325+
self._arctic_lib.check_quota()
326+
322327
symbol = sym[SYMBOL]
323328

324329
if chunk_range is not None:
@@ -535,3 +540,32 @@ def reverse_iterator(self, symbol, chunk_range=None):
535540

536541
for chunk in chunks:
537542
yield self.read(symbol, chunk_range=c.to_range(chunk[0], chunk[1]))
543+
544+
def stats(self):
545+
"""
546+
Return storage statistics about the library
547+
548+
Returns
549+
-------
550+
dictionary of storage stats
551+
"""
552+
553+
res = {}
554+
db = self._collection.database
555+
conn = db.connection
556+
res['sharding'] = {}
557+
try:
558+
sharding = conn.config.databases.find_one({'_id': db.name})
559+
if sharding:
560+
res['sharding'].update(sharding)
561+
res['sharding']['collections'] = list(conn.config.collections.find({'_id': {'$regex': '^' + db.name + "\..*"}}))
562+
except OperationFailure:
563+
# Access denied
564+
pass
565+
res['dbstats'] = db.command('dbstats')
566+
res['chunks'] = db.command('collstats', self._collection.name)
567+
res['symbols'] = db.command('collstats', self._symbols.name)
568+
res['totals'] = {'count': res['chunks']['count'],
569+
'size': res['chunks']['size'] + res['symbols']['size'],
570+
}
571+
return res

arctic/serialization/numpy_arrays.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,9 @@ def serialize(self, df):
150150
else:
151151
dtype = 'dataframe'
152152

153+
if (len(df.index.names) > 1 and None in df.index.names) or None in list(df.columns.values):
154+
raise Exception("All columns and indexes must be named")
155+
153156
if df.index.names != [None]:
154157
index = df.index.names
155158
df = df.reset_index()

setup.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,8 +99,8 @@ def run_tests(self):
9999
tests_require=["mock",
100100
"mockextras",
101101
"pytest<=2.9.2",
102-
"pytest-cov",
103-
"pytest-dbfixtures>=0.15.0",
102+
"pytest-cov<=2.3.1",
103+
"pytest-dbfixtures==0.15.0",
104104
"pytest-timeout",
105105
"pytest-xdist",
106106
],

tests/integration/chunkstore/test_chunkstore.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1150,3 +1150,25 @@ def test_iterators(chunkstore_lib):
11501150
dr = DateRange(dt(2016, 1, 2), dt(2016, 1, 2))
11511151
assert(len(list(chunkstore_lib.iterator('test_df', chunk_range=dr))) == 1)
11521152
assert(len(list(chunkstore_lib.reverse_iterator('test_df', chunk_range=dr))) == 1)
1153+
1154+
1155+
def test_unnamed_colums(chunkstore_lib):
1156+
df = DataFrame(data={'data': [1, 2, 3]},
1157+
index=MultiIndex.from_tuples([(dt(2016, 1, 1), 1),
1158+
(dt(2016, 1, 2), 1),
1159+
(dt(2016, 1, 3), 1)],
1160+
names=['date', None])
1161+
)
1162+
with pytest.raises(Exception) as e:
1163+
chunkstore_lib.write('test_df', df, chunk_size='D')
1164+
assert('must be named' in str(e))
1165+
1166+
df = DataFrame(data={None: [1, 2, 3]},
1167+
index=MultiIndex.from_tuples([(dt(2016, 1, 1), 1),
1168+
(dt(2016, 1, 2), 1),
1169+
(dt(2016, 1, 3), 1)],
1170+
names=['date', 'id'])
1171+
)
1172+
with pytest.raises(Exception) as e:
1173+
chunkstore_lib.write('test_df', df, chunk_size='D')
1174+
assert('must be named' in str(e))

0 commit comments

Comments
 (0)