From 9907eadb0d53e0e77cd940aa8ea38969c138cb75 Mon Sep 17 00:00:00 2001 From: anttil <anttil> Date: Fri, 18 Dec 2015 14:58:49 +0000 Subject: [PATCH] SSDM-2885: simple query client SVN: 35376 --- .../source/python/entity-history/formatter.py | 75 ++++++++++++++++--- .../python/entity-history/show-history.sh | 24 +++++- 2 files changed, 87 insertions(+), 12 deletions(-) diff --git a/openbis/source/python/entity-history/formatter.py b/openbis/source/python/entity-history/formatter.py index af8260a6d89..fe023461137 100755 --- a/openbis/source/python/entity-history/formatter.py +++ b/openbis/source/python/entity-history/formatter.py @@ -2,6 +2,8 @@ import json import sys from datetime import datetime import time +import collections +import copy entity_id = sys.argv[1] @@ -21,19 +23,74 @@ def report(time, entity): print "%s: %s" % (key, value) +epoch = datetime.utcfromtimestamp(0) def timestamptonumber(s): - return time.mktime(datetime.strptime(s,"%Y-%m-%d %H:%M:%S.%f").timetuple()) + return (datetime.strptime(s,"%Y-%m-%d %H:%M:%S.%f") - epoch).total_seconds() * 1000.0 -current_timestamp = content[entity_id][0]['time'] -entity = dict() +data = dict() for entry in content[entity_id]: - if abs(timestamptonumber(entry['time']) - timestamptonumber(current_timestamp)) > 2: - report(current_timestamp, entity) - current_timestamp = entry['time'] + + key = entry['key'] + value = entry['value'] + validfrom = entry['validFrom'] + validuntil = None + + if 'validUntil' in entry: + validuntil = entry['validUntil'] + + if validfrom in data: + data[validfrom].append([validfrom, key, value, "begin"]) + else: + data[validfrom] = [[validfrom, key, value, "begin"]] - entity[entry['key']] = entry['value'] + if validuntil is not None: + if validuntil in data: + data[validuntil].append([validfrom, key, value, "end"]) + else: + data[validuntil] = [[validfrom, key, value, "end"]] + + +sorted_data = collections.OrderedDict(sorted(data.items(), key=lambda t: timestamptonumber(t[0]))) + +history = [] +currenttime = next(iter(sorted_data)) +currententity = dict() + +for timestamp, events in sorted_data.iteritems(): + if currenttime != timestamp: + element = copy.deepcopy(currententity) + element['time'] = currenttime + currenttime = timestamp + history.append(element) + + + for event in filter(lambda event: event[3] == "end", events): + key = event[1] + value = event[2] + currententity[key].remove(value) + if len(currententity[key]) == 0: + del currententity[key] + + for event in filter(lambda event: event[3] == "begin", events): + key = event[1] + value = event[2] + if key not in currententity: + currententity[key] = set([value]) + else: + currententity[key].add(value) + +if currententity != history[-1]: + currententity['time'] = currenttime + history.append(currententity) + +for state in history: + print "-- %s --" % state['time'] + + for key, value in collections.OrderedDict(reversed(list(state.items()))).iteritems(): + if key != 'time': + for element in value: + print "%s: %s" % (key, element) + print "\n" -report(current_timestamp, entity) -print "\n" diff --git a/openbis/source/python/entity-history/show-history.sh b/openbis/source/python/entity-history/show-history.sh index 095f8f0fb1b..89028740cbe 100755 --- a/openbis/source/python/entity-history/show-history.sh +++ b/openbis/source/python/entity-history/show-history.sh @@ -1,5 +1,23 @@ #!/bin/bash -psql -dopenbis_dev -A -t -c \ -"SELECT content FROM events WHERE identifiers LIKE '$1, %' OR identifiers LIKE '%, $1' OR identifiers LIKE '%, $1,%' OR identifiers = '$1'" | -python formatter.py $1 \ No newline at end of file + +usage() { + echo "Usage: $0 <database name> <entity perm id>" + exit 1 +} + +check_arguments() { + if [ $# -ne 2 ]; then + usage + fi +} + +check_arguments $@ +DB_NAME=$1 +PERM_ID=$2 + +echo "SELECT content FROM events WHERE identifiers LIKE '$PERM_ID, %' OR identifiers LIKE '%, $PERM_ID' OR identifiers LIKE '%, $PERM_ID,%' OR identifiers = '$PERM_ID'" + +psql -d $DB_NAME -A -t -c \ +"SELECT content FROM events WHERE identifiers LIKE '$PERM_ID, %' OR identifiers LIKE '%, $PERM_ID' OR identifiers LIKE '%, $PERM_ID,%' OR identifiers = '$PERM_ID'" | +python formatter.py $PERM_ID -- GitLab