diff python/storage.py @ 910:b58a1061a717

loading is faster for longest object features
author Nicolas Saunier <nicolas.saunier@polymtl.ca>
date Wed, 28 Jun 2017 15:36:25 -0400
parents cd038493f8c6
children 1cd878812529
line wrap: on
line diff
--- a/python/storage.py	Mon Jun 26 17:45:32 2017 -0400
+++ b/python/storage.py	Wed Jun 28 15:36:25 2017 -0400
@@ -234,7 +234,7 @@
 
 def loadUserTypesFromTable(cursor, objectNumbers):
     objectCriteria = getObjectCriteria(objectNumbers)
-    queryStatement = 'SELECT object_id, road_user_type from objects'
+    queryStatement = 'SELECT object_id, road_user_type FROM objects'
     if objectNumbers is not None:
         queryStatement += ' WHERE object_id '+objectCriteria
     cursor.execute(queryStatement)
@@ -265,13 +265,12 @@
         cursor = connection.cursor()
         try:
             # attribute feature numbers to objects
-            objectCriteria = getObjectCriteria(objectNumbers)
             queryStatement = 'SELECT trajectory_id, object_id FROM objects_features'
             if objectNumbers is not None:
-                queryStatement += ' WHERE object_id '+objectCriteria
+                queryStatement += ' WHERE object_id '+getObjectCriteria(objectNumbers)
             queryStatement += ' ORDER BY object_id' # order is important to group all features per object
+            logging.debug(queryStatement)
             cursor.execute(queryStatement) 
-            logging.debug(queryStatement)
 
             featureNumbers = {}
             for row in cursor:
@@ -304,6 +303,29 @@
     connection.close()
     return objects
 
+def loadObjectFeatureFrameNumbers(filename, objectNumbers = None):
+    'Loads the feature frame numbers for each object'
+    connection = sqlite3.connect(filename)
+    cursor = connection.cursor()
+    try:
+        queryStatement = 'SELECT OF.object_id, TL.trajectory_id, TL.length FROM (SELECT trajectory_id, max(frame_number)-min(frame_number) AS length FROM positions GROUP BY trajectory_id) TL, objects_features OF WHERE TL.trajectory_id = OF.trajectory_id'
+        if objectNumbers is not None:
+            queryStatement += ' AND object_id '+getObjectCriteria(objectNumbers)
+        queryStatement += ' ORDER BY OF.object_id, TL.length DESC'
+        logging.debug(queryStatement)
+        cursor.execute(queryStatement)
+        objectFeatureNumbers = {}
+        for row in cursor:
+            objId = row[0]
+            if objId in objectFeatureNumbers:
+                objectFeatureNumbers[objId].append(row[1])
+            else:
+                objectFeatureNumbers[objId] = [row[1]]
+        return objectFeatureNumbers
+    except sqlite3.OperationalError as error:
+        printDBError(error)
+        return None
+
 def addCurvilinearTrajectoriesFromSqlite(filename, objects):
     '''Adds curvilinear positions (s_coordinate, y_coordinate, lane)
     from a database to an existing MovingObject dict (indexed by each objects's num)'''