Skip to content

Commit bebae88

Browse files
committed
add support for track_order
1 parent 73108fd commit bebae88

File tree

15 files changed

+210
-188
lines changed

15 files changed

+210
-188
lines changed

h5pyd/_hl/attrs.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -304,7 +304,7 @@ def _get_created(name):
304304
attr_json = self._parent.id.db.getAttribute(obj_id, name, includeData=False)
305305
return attr_json["created"]
306306

307-
if self._parent.track_order:
307+
if self._parent.id.create_order:
308308
attrs = sorted(attrs, key=lambda x: _get_created(x))
309309
else:
310310
attrs = sorted(attrs)

h5pyd/_hl/base.py

Lines changed: 1 addition & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -331,25 +331,13 @@ def created(self):
331331

332332
return dt
333333

334-
@property
335-
def track_order(self):
336-
return self._track_order
337-
338334
@property
339335
def read_only(self):
340336
if isinstance(self.id.db.writer, H5NullWriter):
341337
return True
342338
else:
343339
return False
344340

345-
@property
346-
def creation_properties(self):
347-
db = self.id.db
348-
obj_json = db.getObjectById(self.id.uuid)
349-
if "creationProperties" in obj_json:
350-
return obj_json["creationProperties"]
351-
return {}
352-
353341
def verifyCert(self):
354342
# default to validate CERT for https requests, unless
355343
# the H5PYD_VERIFY_CERT environment variable is set and True
@@ -393,24 +381,7 @@ def __init__(self, oid, file=None, track_order=None):
393381
self.log.addHandler(fh)
394382
else:
395383
pass
396-
397-
if track_order is None:
398-
# set order based on creation props
399-
obj_json = self.id.obj_json
400-
if "creationProperties" in obj_json:
401-
cpl = obj_json["creationProperties"]
402-
else:
403-
cpl = {}
404-
if "CreateOrder" in cpl:
405-
createOrder = cpl["CreateOrder"]
406-
if not createOrder or createOrder == "0":
407-
self._track_order = False
408-
else:
409-
self._track_order = True
410-
else:
411-
self._track_order = False
412-
else:
413-
self._track_order = track_order
384+
self._track_order = None # TBD: set by track_order?
414385

415386
def __hash__(self):
416387
return hash(self.id.id)

h5pyd/_hl/dataset.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -662,7 +662,7 @@ def maxshape(self):
662662
@property
663663
def fillvalue(self):
664664
"""Fill value for this dataset (0 by default)"""
665-
dcpl = self.id.dcpl_json
665+
dcpl = self.id.cpl_json
666666
if "fillValue" in dcpl:
667667
fill_value = dcpl["fillValue"]
668668
if isinstance(fill_value, list):

h5pyd/_hl/files.py

Lines changed: 18 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -219,10 +219,11 @@ def filename(self):
219219
def _getStats(self):
220220
""" return info on storage usage """
221221
self._verifyOpen()
222-
if self.id.db.writer:
223-
stats = self.id.db.writer.getStats()
224-
elif self.id.db.reader:
222+
223+
if self.id.db.reader:
225224
stats = self.id.db.reader.getStats()
225+
elif self.id.db.writer:
226+
stats = self.id.db.writer.getStats()
226227
else:
227228
stats = {"created": 0, "lastModified": 0, "owner": 0}
228229
return stats
@@ -272,13 +273,13 @@ def created(self):
272273
"""Creation time of the domain"""
273274
self._verifyOpen()
274275
stats = self._getStats()
275-
return stats["created"]
276+
return stats.get("created")
276277

277278
@property
278279
def owner(self):
279280
"""Username of the owner of the domain"""
280281
stats = self._getStats()
281-
return stats["owner"]
282+
return stats.get("owner")
282283

283284
@property
284285
def limits(self):
@@ -315,15 +316,14 @@ def _init_db(self,
315316
bucket=None,
316317
api_key=None,
317318
swmr=False,
319+
track_order=None,
318320
getobjs=True,
319321
retries=10,
320322
timeout=180,
321323
**kwds,
322324
):
323325
# initialize h5db using domain path
324326

325-
cfg = config.get_config() # pulls in state from a .hscfg file (if found).
326-
327327
# accept domain values in the form:
328328
# http://server:port/home/user/myfile.h5
329329
# or
@@ -359,31 +359,10 @@ def _init_db(self,
359359
if domain[0] != "/":
360360
raise IOError(400, "relative paths are not valid")
361361

362-
if endpoint is None:
363-
if "hs_endpoint" in cfg:
364-
endpoint = cfg["hs_endpoint"]
365-
366362
# remove the trailing slash on endpoint if it exists
367363
if endpoint and endpoint.endswith('/'):
368364
endpoint = endpoint.strip('/')
369365

370-
if username is None:
371-
if "hs_username" in cfg:
372-
username = cfg["hs_username"]
373-
374-
if password is None:
375-
if "hs_password" in cfg:
376-
password = cfg["hs_password"]
377-
378-
if api_key is None and "hs_api_key" in cfg:
379-
api_key = cfg["hs_api_key"]
380-
381-
if bucket is None:
382-
if "HS_BUCKET" in os.environ:
383-
bucket = os.environ["HS_BUCKET"]
384-
elif "hs_bucket" in cfg:
385-
bucket = cfg["hs_bucket"]
386-
387366
db = Hdf5db(app_logger=self.log) # initialize hdf5 db
388367

389368
kwargs = {"app_logger": self.log}
@@ -403,6 +382,8 @@ def _init_db(self,
403382
kwargs["retries"] = retries
404383
if timeout:
405384
kwargs["timeout"] = timeout
385+
if track_order:
386+
kwargs["track_order"] = track_order
406387

407388
root_id = None
408389

@@ -503,8 +484,11 @@ def __init__(
503484
"""
504485

505486
self.log = logging.getLogger()
487+
cfg = config.get_config() # pulls in state from a .hscfg file (if found).
506488

507489
self.log.setLevel(logging.ERROR)
490+
if track_order is None:
491+
track_order = cfg.track_order
508492

509493
# if we're passed a GroupId as domain, just initialize the file object
510494
# with that. This will be faster and enable the File object to share the same http connection.
@@ -538,12 +522,14 @@ def __init__(
538522
kwargs["swmr"] = swmr
539523
if bucket:
540524
kwargs["bucket"] = bucket
525+
if track_order is not None:
526+
kwargs["track_order"] = track_order
541527
kwargs["getobjs"] = True # TBD: disable this optionally?
542528

543529
db = self._init_db(domain, **kwargs)
544530

545531
root_id = db.root_id
546-
root_json = db.getObjectById(root_id)
532+
root_json = db.getObjectById(root_id, refresh=True)
547533

548534
if "limits" in root_json:
549535
self._limits = root_json["limits"]
@@ -564,6 +550,9 @@ def __init__(
564550
self._lastScan = None # when summary stats where last updated by server
565551
self._swmr_mode = swmr
566552

553+
if track_order is None:
554+
track_order = cfg.track_order
555+
567556
Group.__init__(self, self._id, track_order=track_order)
568557

569558
def _getVerboseInfo(self):
@@ -715,31 +704,6 @@ def compressors(self):
715704
compressors = []
716705
return compressors
717706

718-
# override base implemention of ACL methods to use the domain rather than update root group
719-
def getACL(self, username):
720-
req = "/acls/" + username
721-
rsp_json = self.GET(req)
722-
acl_json = rsp_json["acl"]
723-
return acl_json
724-
725-
def getACLs(self):
726-
req = "/acls"
727-
rsp_json = self.GET(req)
728-
acls_json = rsp_json["acls"]
729-
return acls_json
730-
731-
def putACL(self, acl):
732-
if "userName" not in acl:
733-
raise IOError(404, "ACL has no 'userName' key")
734-
perm = {}
735-
for k in ("create", "read", "update", "delete", "readACL", "updateACL"):
736-
if k not in acl:
737-
raise IOError(404, "Missing ACL field: {}".format(k))
738-
perm[k] = acl[k]
739-
740-
req = "/acls/" + acl["userName"]
741-
self.PUT(req, body=perm)
742-
743707
def run_scan(self):
744708
MAX_WAIT = 10
745709
self._getVerboseInfo()

h5pyd/_hl/group.py

Lines changed: 12 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -40,25 +40,9 @@ def __init__(self, bind, track_order=None, **kwargs):
4040

4141
""" Create a new Group object by binding to a low-level GroupID.
4242
"""
43-
4443
if not isinstance(bind, GroupID):
4544
raise ValueError(f"{bind} is not a GroupID")
4645
HLObject.__init__(self, bind, track_order=track_order, **kwargs)
47-
"""
48-
if track_order is None:
49-
# set order based on group creation props
50-
gcpl = self.id.gcpl_json
51-
if "CreateOrder" in gcpl:
52-
createOrder = gcpl["CreateOrder"]
53-
if not createOrder or createOrder == "0":
54-
self._track_order = False
55-
else:
56-
self._track_order = True
57-
else:
58-
self._track_order = False
59-
else:
60-
self._track_order = track_order
61-
"""
6246

6347
def _get_link_json(self, h5path):
6448
""" Return parent_uuid and json description of link for given path """
@@ -326,7 +310,7 @@ def create_dataset_like(self, name, other, **kwupdate):
326310
kwupdate.setdefault(k, getattr(other, k))
327311
# TODO: more elegant way to pass these (dcpl to create_dataset?)
328312
"""
329-
dcpl_json = other.id.dcpl_json
313+
dcpl_json = other.id.cpl_json
330314
track_order = None
331315
if "CreateOrder" in dcpl_json:
332316
createOrder = dcpl_json["CreateOrder"]
@@ -779,7 +763,16 @@ def __iter__(self):
779763
for title in titles:
780764
links[title] = self.id.db.getLink(self.id.uuid, title)
781765

782-
if self.track_order:
766+
track_order = None
767+
if self._track_order is not None:
768+
print("self._track_order:", self._track_order)
769+
# track_order = self._track_order
770+
elif self.id.create_order is not None:
771+
track_order = self.id.create_order
772+
else:
773+
track_order = False
774+
775+
if track_order:
783776
links = sorted(links.items(), key=lambda x: x[1]['created'])
784777
else:
785778
links = sorted(links.items())
@@ -1021,7 +1014,7 @@ def __reversed__(self):
10211014
for title in titles:
10221015
links[title] = self.id.db.getLink(self.id.uuid, title)
10231016

1024-
if self.track_order:
1017+
if self.id.create_order:
10251018
links = sorted(links.items(), key=lambda x: x[1]['created'])
10261019
else:
10271020
links = sorted(links.items())

h5pyd/_hl/objectid.py

Lines changed: 21 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,25 @@ def obj_json(self):
6363
"""json representation of the object"""
6464
return self.db.getObjectById(self.uuid)
6565

66+
@property
67+
def cpl_json(self):
68+
""" return creationProperties if found """
69+
obj_json = self.obj_json
70+
if "creationProperties" in obj_json:
71+
cpl = obj_json["creationProperties"]
72+
else:
73+
cpl = {}
74+
return cpl
75+
76+
@property
77+
def create_order(self):
78+
""" return create order from cpl or None if not set """
79+
cpl = self.cpl_json
80+
if "CreateOrder" in cpl:
81+
return cpl["CreateOrder"]
82+
else:
83+
return None
84+
6685
@property
6786
def modified(self):
6887
"""last modified timestamp"""
@@ -171,15 +190,6 @@ def get_type(self):
171190
dtype = createDataType(type_json)
172191
return dtype
173192

174-
@property
175-
def tcpl_json(self):
176-
obj_json = self.obj_json
177-
if 'creationProperties' in obj_json:
178-
tcpl = obj_json['creationProperties']
179-
else:
180-
tcpl = {}
181-
return tcpl
182-
183193
def __init__(self, parent, obj_id, **kwds):
184194
"""Create a new TypeID.
185195
"""
@@ -208,20 +218,11 @@ def get_type(self):
208218
dtype = createDataType(type_json)
209219
return dtype
210220

211-
@property
212-
def dcpl_json(self):
213-
obj_json = self.obj_json
214-
if 'creationProperties' in obj_json:
215-
dcpl = obj_json['creationProperties']
216-
else:
217-
dcpl = {}
218-
return dcpl
219-
220221
@property
221222
def layout(self):
222223
layout = None
223224

224-
dcpl = self.dcpl_json
225+
dcpl = self.cpl_json
225226
if dcpl and 'layout' in dcpl:
226227
layout = dcpl['layout']
227228

@@ -230,7 +231,7 @@ def layout(self):
230231
@property
231232
def filters(self):
232233
filters = []
233-
dcpl = self.dcpl_json
234+
dcpl = self.cpl_json
234235
if dcpl and 'filters' in dcpl:
235236
filters = dcpl['filters']
236237
return filters
@@ -271,12 +272,3 @@ def __init__(self, parent, obj_id, **kwds):
271272

272273
if self.collection_type != "groups":
273274
raise IOError(f"Unexpected collection_type: {self._collection_type}")
274-
275-
@property
276-
def gcpl_json(self):
277-
obj_json = self.obj_json
278-
if 'creationProperties' in obj_json:
279-
gcpl = obj_json['creationProperties']
280-
else:
281-
gcpl = {}
282-
return gcpl

h5pyd/config.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -192,15 +192,15 @@ def track_order(self):
192192
if "track_order" in Config._cfg:
193193
track = Config._cfg["track_order"]
194194
else:
195-
track = False
195+
track = None
196196
return track
197197

198198
@track_order.setter
199199
def track_order(self, value):
200200
if isinstance(value, str):
201201
tokens = value.split()
202202
if len(tokens) == 0:
203-
track = False
203+
track = None
204204
else:
205205
track = bool(tokens[0]) # strip any comments
206206
else:

0 commit comments

Comments
 (0)