changeset 1173:c1766bb5076c

udpated the iframework metadata to allow adding it to an existing database, and creating only a subset of tables for group/person attributes
author Nicolas Saunier <nicolas.saunier@polymtl.ca>
date Mon, 18 Oct 2021 11:42:53 -0400
parents f9ab0cbb92da
children 2f89dc3d99e5
files trafficintelligence/iframework.py
diffstat 1 files changed, 29 insertions(+), 26 deletions(-) [+]
line wrap: on
line diff
--- a/trafficintelligence/iframework.py	Tue Oct 12 16:34:43 2021 -0400
+++ b/trafficintelligence/iframework.py	Mon Oct 18 11:42:53 2021 -0400
@@ -22,7 +22,7 @@
     idx = Column(Integer, primary_key=True)
     personIdx = Column(Integer, ForeignKey('persons.idx'))
     vehicleIdx = Column(Integer, ForeignKey('vehicles.idx'))
-    transport = Column(SQLEnum(ModeEnum), nullable=False)
+    name = Column(SQLEnum(ModeEnum), nullable=False)
     startTime = Column(DateTime) # None first time if only one mode
     pointIdx = Column(Integer, ForeignKey('points.idx'))
 
@@ -30,16 +30,16 @@
     vehicle = relationship('Vehicle')
     point = relationship('Point')
 
-    def __init__(self, transport, person, vehicle = None, startTime = None, p = None):
+    def __init__(self, name, person, vehicle = None, startTime = None, p = None):
         self.person = person
-        self.transport = transport
+        self.name = name
         self.vehicle = vehicle
         self.startTime = startTime
         self.point = p
 
     @staticmethod
-    def initGroup(transport, group, vehicle = None, startTime = None):
-        return [Mode(transport, p, startTime) for p in group.getPersons()]
+    def initGroup(name, group, vehicle = None, startTime = None):
+        return [Mode(name, p, startTime) for p in group.getPersons()]
 
 class Group(Base):
     __tablename__ = 'groups'
@@ -166,19 +166,19 @@
         self.points.append(Point(x, y))
 
 class AbstractCrossing:
-    def initPersonGroupCrossing(self, group, person, transport, vehicle):
+    def initPersonGroupCrossing(self, group, person, modeName, vehicle):
         ''' initiates with the passing the group or person
 
         design question: what should be done about simple line counting, 
         without information about persons'''
         if person is None and group is not None: # create group
             self.group = group
-            if transport is not None:
-                Mode.initGroup(transport, group, vehicle)
+            if modeName is not None:
+                Mode.initGroup(modeName, group, vehicle)
         elif person is not None and group is None: # create person
             self.group = Group([person])
-            if transport is not None:
-                Mode(transport, person, vehicle)
+            if modeName is not None:
+                Mode(modeName, person, vehicle)
         else:
             print('Warning: passing person and group or both None')
 
@@ -196,15 +196,15 @@
     group = relationship('Group')
     point = relationship('Point')
 
-    def __init__(self, line, instant, speed = None, wrongDirection = None, p = None, group = None, person = None, transport = None, vehicle = None):
+    def __init__(self, line, instant, speed = None, wrongDirection = None, p = None, group = None, person = None, modeName = None, vehicle = None):
         # makes it possible to create person and mode for just counting
-        # pass transport as string to instantiate after
+        # pass modeName as string to instantiate after
         self.line = line
         self.instant = instant
         self.speed = speed
         self.wrongDirection = wrongDirection
         self.point = p
-        self.initPersonGroupCrossing(group, person, transport, vehicle)
+        self.initPersonGroupCrossing(group, person, modeName, vehicle)
 
 class ZoneCrossing(AbstractCrossing,Base):
     __tablename__ = 'zonecrossings'
@@ -219,12 +219,12 @@
     group = relationship('Group')
     point = relationship('Point')
 
-    def __init__(self, zone, instant, entering, p = None, group = None, person = None, transport = None, vehicle = None):
+    def __init__(self, zone, instant, entering, p = None, group = None, person = None, modeName = None, vehicle = None):
         self.zone = zone
         self.instant = instant
         self.entering = entering
         self.point = p
-        self.initPersonGroupCrossing(group, person, transport, vehicle)
+        self.initPersonGroupCrossing(group, person, modeName, vehicle)
 
 class Activity(AbstractCrossing,Base):
     __tablename__ = 'activities'
@@ -241,22 +241,25 @@
     zone = relationship('Zone')
     point = relationship('Point')
   
-    def __init__(self, activity, startTime, endTime, zone, p = None, group = None, person = None, transport = None, vehicle = None):
+    def __init__(self, activity, startTime, endTime, zone, p = None, group = None, person = None, modeName = None, vehicle = None):
         self.activity = activity
         self.startTime = startTime
         self.endTime = endTime
         self.zone = zone
         self.point = p
-        self.initPersonGroupCrossing(group, person, transport, vehicle)
+        self.initPersonGroupCrossing(group, person, modeName, vehicle)
 
-def createDatabase(filename):
+def createDatabase(filename, insertInExisting = False, createOnlyGroupTables = False):
     'creates a session to query the filename'
-    if Path(filename).is_file():
+    if Path(filename).is_file() and not insertInExisting:
         print('The file '+filename+' exists')
         return None
     else:
         engine = create_engine('sqlite:///'+filename)
-        Base.metadata.create_all(engine)
+        if createOnlyGroupTables: 
+            Base.metadata.create_all(engine, tables = [Base.metadata.tables['modes'], Base.metadata.tables['groups'], Base.metadata.tables['groupbelongings'], Base.metadata.tables['persons'], Base.metadata.tables['vehicles'], Base.metadata.tables['points']])
+        else:
+            Base.metadata.create_all(engine)
         Session = sessionmaker(bind=engine)
         return Session()
 
@@ -282,18 +285,18 @@
     line = Line('line1', 0.,0.,0.,10.)
     zone = Zone('zone1', [0., 0., 1., 1.], [0., 1., 1., 0.])
     destination = Zone('destination1', [10., 10., 11., 11.], [10., 11., 11., 10.])
-    counts = [LineCrossing(line, datetime(2020,7,2,23,20+i), person = Person(20+i, 'female', disability = True), transport = 'walking') for i in range(5)]
+    counts = [LineCrossing(line, datetime(2020,7,2,23,20+i), person = Person(20+i, 'female', disability = True), modeName = 'walking') for i in range(5)]
     group1 = Group([Person(13+i,'female', False, False, True, False) for i in range(3)])
     groupMode1 = Mode.initGroup('walking', group1)
     activities = [Activity('walking', datetime(2020,7,2,23,0), datetime(2020,7,2,23,10), zone, person = Person(40, 'male', True, False, True, False)),
                   Activity('eating', datetime(2020,7,2,23,10), datetime(2020,7,2,23,12), zone, person = Person(40, 'male', True, False, True, False)),
                   Activity('playing', datetime(2020,7,2,22,0), datetime(2020,7,2,23,0), zone, group = group1)]
     counts.append(LineCrossing(line, datetime(2020,7,2,23,5), group = group1))
-    counts.append(LineCrossing(line, datetime(2020,7,2,23,7), person = Person(23, 'unknown'), transport = 'cardriver', vehicle = Vehicle('car')))
-    counts.append(LineCrossing(line, datetime(2020,7,2,23,9), person = Person('teen', 'unknown'), transport = 'scooter', vehicle = Vehicle('scooter')))
-    counts.append(LineCrossing(line, datetime(2020,7,2,23,11), person = Person(12, 'female'), transport = 'bike'))
-    counts.append(LineCrossing(line, datetime(2020,7,2,23,13), person = Person(), transport = 'cardriver')) # example of counting cars without knowing the driver and passenger's attributes
-    counts.append(LineCrossing(line, datetime(2020,7,2,23,15), group = Group([Person(34+i) for i in range(3)]), transport = 'carpassenger'))
+    counts.append(LineCrossing(line, datetime(2020,7,2,23,7), person = Person(23, 'unknown'), modeName = 'cardriver', vehicle = Vehicle('car')))
+    counts.append(LineCrossing(line, datetime(2020,7,2,23,9), person = Person('teen', 'unknown'), modeName = 'other', vehicle = Vehicle('scooter')))
+    counts.append(LineCrossing(line, datetime(2020,7,2,23,11), person = Person(12, 'female'), modeName = 'cycling'))
+    counts.append(LineCrossing(line, datetime(2020,7,2,23,13), person = Person(), modeName = 'cardriver')) # example of counting cars without knowing the driver and passenger's attributes
+    counts.append(LineCrossing(line, datetime(2020,7,2,23,15), group = Group([Person(34+i) for i in range(3)]), modeName = 'carpassenger'))
 
     
     counts.append(ZoneCrossing(zone, datetime(2020,7,7,9,5), True, person = Person(33, 'male', False, False, True, False)))