summaryrefslogtreecommitdiff
path: root/megapixels/app/models/sql_factory.py
diff options
context:
space:
mode:
authoradamhrv <adam@ahprojects.com>2019-01-14 22:25:25 +0100
committeradamhrv <adam@ahprojects.com>2019-01-14 22:25:25 +0100
commitdf9d364e3664f45c65cac5990d3d742b990217fa (patch)
tree8842d844a5ea8e6c87599b8683009cba23262713 /megapixels/app/models/sql_factory.py
parent2fedd95fcee3f048c5f24333ffdb9bb4e13eafe2 (diff)
parent3b2f0dc6d969fa323fe8775b4269e17c60192431 (diff)
Merge branch 'master' of github.com:adamhrv/megapixels_dev
Diffstat (limited to 'megapixels/app/models/sql_factory.py')
-rw-r--r--megapixels/app/models/sql_factory.py180
1 files changed, 112 insertions, 68 deletions
diff --git a/megapixels/app/models/sql_factory.py b/megapixels/app/models/sql_factory.py
index a580f28e..5b3cb5a3 100644
--- a/megapixels/app/models/sql_factory.py
+++ b/megapixels/app/models/sql_factory.py
@@ -3,7 +3,7 @@ import glob
import time
import pandas as pd
-from sqlalchemy import create_engine, Table, Column, String, Integer, DateTime, Float
+from sqlalchemy import create_engine, Table, Column, String, Integer, DateTime, Float, func
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
@@ -62,7 +62,8 @@ def load_sql_dataset(path, replace=False, engine=None, base_model=None):
df = pd.read_csv(fn)
# fix columns that are named "index", a sql reserved word
df.reindex_axis(sorted(df.columns), axis=1)
- df.columns = sorted(table.__table__.columns).keys()
+ columns = [column.name for column in table.__table__.columns]
+ df.columns = columns
df.to_sql(name=table.__tablename__, con=engine, if_exists='replace', index=False)
return dataset
@@ -82,87 +83,153 @@ class SqlDataset:
self.base_model = base_model
def describe(self):
+ """
+ List the available SQL tables for a given dataset.
+ """
return {
'name': self.name,
'tables': list(self.tables.keys()),
}
def get_identity(self, id):
- table = self.get_table('identity_meta')
+ """
+ Get an identity given an ID.
+ """
# id += 1
- identity = table.query.filter(table.image_id <= id).order_by(table.image_id.desc()).first().toJSON()
+ file_record_table = self.get_table('file_record')
+ file_record = file_record_table.query.filter(file_record_table.id == id).first()
+
+ if not file_record:
+ return None
+
+ identity_table = self.get_table('identity')
+ identity = identity_table.query.filter(identity_table.id == file_record.identity_id).first()
+
+ if not identity:
+ return None
+
return {
- 'uuid': self.select('uuids', id),
- 'identity': identity,
- 'roi': self.select('roi', id),
- 'pose': self.select('pose', id),
+ 'file_record': file_record.toJSON(),
+ 'identity': identity.toJSON(),
+ 'face_roi': self.select('face_roi', id),
+ 'face_pose': self.select('face_pose', id),
}
def search_name(self, q):
- table = self.get_table('identity_meta')
- uuid_table = self.get_table('uuids')
+ """
+ Find an identity by name.
+ """
+ table = self.get_table('identity')
+ identity_list = table.query.filter(table.fullname.ilike(q)).order_by(table.fullname.desc()).limit(15)
+ return identity_list
- identity = table.query.filter(table.fullname.like(q)).order_by(table.fullname.desc()).limit(30)
+ def search_description(self, q):
+ """
+ Find an identity by description.
+ """
+ table = self.get_table('identity')
+ identity_list = table.query.filter(table.description.ilike(q)).order_by(table.description.desc()).limit(15)
+ return identity_list
+
+ def get_file_records_for_identities(self, identity_list):
+ """
+ Given a list of identities, map these to file records.
+ """
identities = []
- for row in identity:
- uuid = uuid_table.query.filter(uuid_table.id == row.image_id).first()
- identities.append({
- 'uuid': uuid.toJSON(),
- 'identity': row.toJSON(),
- })
+ file_record_table = self.get_table('file_record')
+ for row in identity_list:
+ file_record = file_record_table.query.filter(file_record_table.identity_id == row.id).first()
+ if file_record:
+ identities.append({
+ 'file_record': file_record.toJSON(),
+ 'identity': row.toJSON(),
+ })
return identities
def select(self, table, id):
+ """
+ Perform a generic select.
+ """
table = self.get_table(table)
if not table:
return None
session = Session()
# for obj in session.query(table).filter_by(id=id):
- # print(table)
+ # print(table)
obj = session.query(table).filter(table.id == id).first()
session.close()
return obj.toJSON()
def get_table(self, type):
+ """
+ Get one of these memoized, dynamically generated tables.
+ """
if type in self.tables:
return self.tables[type]
- elif type == 'uuids':
- self.tables[type] = self.uuid_table()
- elif type == 'roi':
- self.tables[type] = self.roi_table()
- elif type == 'identity_meta':
+ elif type == 'file_record':
+ self.tables[type] = self.file_record_table()
+ elif type == 'identity':
self.tables[type] = self.identity_table()
- elif type == 'pose':
- self.tables[type] = self.pose_table()
+ elif type == 'face_roi':
+ self.tables[type] = self.face_roi_table()
+ elif type == 'face_pose':
+ self.tables[type] = self.face_pose_table()
else:
return None
return self.tables[type]
- # ==> uuids.csv <==
- # index,uuid
- # 0,f03fd921-2d56-4e83-8115-f658d6a72287
- def uuid_table(self):
- class UUID(self.base_model):
- __tablename__ = self.name + "_uuid"
+ # ==> file_record.csv <==
+ # index,ext,fn,identity_key,sha256,subdir,uuid,identity_index
+ def file_record_table(self):
+ class FileRecord(self.base_model):
+ __tablename__ = self.name + "_file_record"
id = Column(Integer, primary_key=True)
+ ext = Column(String(3, convert_unicode=True), nullable=False)
+ fn = Column(String(36, convert_unicode=True), nullable=False)
+ identity_key = Column(String(36, convert_unicode=True), nullable=False)
+ sha256 = Column(String(36, convert_unicode=True), nullable=False)
+ subdir = Column(String(36, convert_unicode=True), nullable=False)
uuid = Column(String(36, convert_unicode=True), nullable=False)
+ identity_id = Column(Integer)
def toJSON(self):
return {
'id': self.id,
'uuid': self.uuid,
+ 'identity_id': self.identity_id,
}
- return UUID
+ return FileRecord
- # ==> roi.csv <==
+ # ==> identity.csv <==
+ # index,description,gender,images,fullname
+ # 0,A. J. Cook,Canadian actress,f,1,0
+ def identity_table(self):
+ class Identity(self.base_model):
+ __tablename__ = self.name + "_identity"
+ id = Column(Integer, primary_key=True)
+ description = Column(String(36, convert_unicode=True), nullable=False)
+ gender = Column(String(1, convert_unicode=True), nullable=False)
+ images = Column(Integer, nullable=False)
+ fullname = Column(String(36, convert_unicode=True), nullable=False)
+ def toJSON(self):
+ return {
+ 'id': self.id,
+ 'fullname': self.fullname,
+ 'images': self.images,
+ 'gender': self.gender,
+ 'description': self.description,
+ }
+ return Identity
+
+ # ==> face_roi.csv <==
# index,h,image_height,image_index,image_width,w,x,y
# 0,0.33000000000000007,250,0,250,0.32999999999999996,0.33666666666666667,0.35
- def roi_table(self):
- class ROI(self.base_model):
+ def face_roi_table(self):
+ class FaceROI(self.base_model):
__tablename__ = self.name + "_roi"
id = Column(Integer, primary_key=True)
h = Column(Float, nullable=False)
image_height = Column(Integer, nullable=False)
- image_index = Column(Integer, nullable=False)
+ record_id = Column(Integer, nullable=False)
image_width = Column(Integer, nullable=False)
w = Column(Float, nullable=False)
x = Column(Float, nullable=False)
@@ -170,7 +237,7 @@ class SqlDataset:
def toJSON(self):
return {
'id': self.id,
- 'image_index': self.image_index,
+ 'record_id': self.record_id,
'image_height': self.image_height,
'image_width': self.image_width,
'w': self.w,
@@ -178,48 +245,25 @@ class SqlDataset:
'x': self.x,
'y': self.y,
}
- return ROI
-
- # ==> identity.csv <==
- # index,fullname,description,gender,images,image_index
- # 0,A. J. Cook,Canadian actress,f,1,0
- def identity_table(self):
- class Identity(self.base_model):
- __tablename__ = self.name + "_identity"
- id = Column(Integer, primary_key=True)
- fullname = Column(String(36, convert_unicode=True), nullable=False)
- description = Column(String(36, convert_unicode=True), nullable=False)
- gender = Column(String(1, convert_unicode=True), nullable=False)
- images = Column(Integer, nullable=False)
- image_id = Column(Integer, nullable=False)
- def toJSON(self):
- return {
- 'id': self.id,
- 'image_id': self.image_id,
- 'fullname': self.fullname,
- 'images': self.images,
- 'gender': self.gender,
- 'description': self.description,
- }
- return Identity
+ return FaceROI
- # ==> pose.csv <==
- # index,image_index,pitch,roll,yaw
+ # ==> face_pose.csv <==
+ # index,record_index,pitch,roll,yaw
# 0,0,11.16264458441435,10.415885631337728,22.99719032415318
- def pose_table(self):
- class Pose(self.base_model):
+ def face_pose_table(self):
+ class FacePose(self.base_model):
__tablename__ = self.name + "_pose"
id = Column(Integer, primary_key=True)
- image_id = Column(Integer, primary_key=True)
+ record_id = Column(Integer, nullable=False)
pitch = Column(Float, nullable=False)
roll = Column(Float, nullable=False)
yaw = Column(Float, nullable=False)
def toJSON(self):
return {
'id': self.id,
- 'image_id': self.image_id,
+ 'record_id': self.record_id,
'pitch': self.pitch,
'roll': self.roll,
'yaw': self.yaw,
}
- return Pose
+ return FacePose