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