Skip to content
Snippets Groups Projects
Commit 261b8013 authored by Jorrit Schaap's avatar Jorrit Schaap
Browse files

Task #9607: added queries to get predecessor and successor ids for a given mom2id

parent 350e4524
No related branches found
No related tags found
No related merge requests found
......@@ -38,6 +38,18 @@ class MoMQueryRPC(RPCWrapper):
logger.info("Received %s projects" % (len(projects)))
return projects
def getPredecessorIds(self, ids):
logger.debug("getSuccessorIds(%s)", ids)
result = self.rpc('GetPredecessorIds', mom_ids=ids)
logger.info("GetPredecessorIds(%s): %s", ids, result)
return result
def getSuccessorIds(self, ids):
logger.debug("getSuccessorIds(%s)", ids)
result = self.rpc('GetSuccessorIds', mom_ids=ids)
logger.info("getSuccessorIds(%s): %s", ids, result)
return result
def main():
# Check the invocation arguments
......@@ -49,6 +61,8 @@ def main():
parser.add_option('-V', '--verbose', dest='verbose', action='store_true', help='verbose logging')
parser.add_option('-P', '--projects', dest='projects', action='store_true', help='get list of all projects')
parser.add_option('-p', '--project_details', dest='project_details', type='int', help='get project details for mom object with given id')
parser.add_option('--predecessors', dest='id_for_predecessors', type='int', help='get the predecessor id\'s for the given mom2id')
parser.add_option('--successors', dest='id_for_successors', type='int', help='get the successors id\'s for the given mom2id')
(options, args) = parser.parse_args()
if len(sys.argv) == 1:
......@@ -71,5 +85,21 @@ def main():
else:
print 'No results'
if options.id_for_predecessors:
predecessor_ids = rpc.getPredecessorIds(options.id_for_predecessors)
if predecessor_ids:
for k, v in predecessor_ids.items():
print ' %s: %s' % (k, v)
else:
print 'No results'
if options.id_for_successors:
successor_ids = rpc.getSuccessorIds(options.id_for_successors)
if successor_ids:
for k, v in successor_ids.items():
print ' %s: %s' % (k, v)
else:
print 'No results'
if __name__ == '__main__':
main()
......@@ -55,6 +55,20 @@ def _isListOfInts(items):
return True
def _toIdsString(mom_ids):
if isinstance(mom_ids, int):
ids = [mom_ids]
elif _isListOfInts(mom_ids):
ids = mom_ids
else:
ids = _idsFromString(mom_ids)
if not ids:
raise ValueError("Could not find proper ids in: " + mom_ids)
ids_str = ','.join([str(id) for id in ids])
return ids_str
class MoMDatabaseWrapper:
'''handler class for details query in mom db'''
def __init__(self, dbcreds):
......@@ -99,18 +113,9 @@ class MoMDatabaseWrapper:
if not mom_ids:
return {}
if _isListOfInts(mom_ids):
ids = mom_ids
else:
ids = _idsFromString(mom_ids)
if not ids:
raise ValueError("Could not find proper ids in: " + mom_ids)
ids_str = ','.join([str(id) for id in ids])
ids_str = _toIdsString(mom_ids)
logger.info("Query for mom id%s: %s" %
('\'s' if len(ids) > 1 else '', ids_str))
logger.info("getProjectDetails for mom ids: %s" % ids_str)
# TODO: make a view for this query in momdb!
query = '''SELECT project.mom2id as project_mom2id, project.id as project_mom2objectid, project.name as project_name, project.description as project_description,
......@@ -160,6 +165,70 @@ class MoMDatabaseWrapper:
return result
def getPredecessorIds(self, mom_ids):
if not mom_ids:
return {}
ids_str = _toIdsString(mom_ids)
logger.info("getPredecessorIds for mom ids: %s" % ids_str)
query = '''SELECT mom2id, predecessor
FROM mom2object
where mom2id in (%s)
order by mom2id;
''' % (ids_str,)
rows = self._executeQuery(query)
result = {}
for row in rows:
mom2id = row['mom2id']
pred_string = row['predecessor']
pred_id_list = [y[1:] for y in [x.strip() for x in pred_string.split(',')] if y[0] == 'M']
pred_id_list = [int(x) for x in pred_id_list if x.isdigit()]
result[str(mom2id)] = pred_id_list
for mom2id in ids_str.split(','):
if not mom2id in result:
result[mom2id] = []
logger.info('predecessors: %s', result)
return result
def getSuccessorIds(self, mom_ids):
if not mom_ids:
return {}
ids_str = _toIdsString(mom_ids)
logger.info("getSuccessorIds for mom ids: %s" % ids_str)
condition = ' OR '.join(['predecessor LIKE \'%%M%s%%\'' % x for x in ids_str.split(',')])
# TODO: make a view for this query in momdb!
query = '''SELECT mom2id, predecessor
FROM mom2object
where %s
order by mom2id;
''' % (condition,)
rows = self._executeQuery(query)
result = {}
for mom2id in ids_str.split(','):
result[mom2id] = []
for row in rows:
suc_mom2id = row['mom2id']
pred_string = row['predecessor']
pred_id_list = [y[1:] for y in [x.strip() for x in pred_string.split(',')] if y[0] == 'M']
for mom2id in ids_str.split(','):
if mom2id in pred_id_list:
result[str(mom2id)].append(suc_mom2id)
logger.info('successors: %s', result)
return result
class ProjectDetailsQueryHandler(MessageHandlerInterface):
'''handler class for details query in mom db
......@@ -171,24 +240,27 @@ class ProjectDetailsQueryHandler(MessageHandlerInterface):
self.service2MethodMap = {
'GetProjects': self.getProjects,
'GetProjectDetails': self.getProjectDetails
'GetProjectDetails': self.getProjectDetails,
'GetPredecessorIds': self.getPredecessorIds,
'GetSuccessorIds': self.getSuccessorIds
}
def prepare_loop(self):
self.momdb = MoMDatabaseWrapper(self.dbcreds)
def getProjectDetails(self, mom_ids):
if not mom_ids:
return {}
ids = _idsFromString(mom_ids)
if not _isListOfInts(ids):
raise ValueError("%s is not a proper list of ints" % str(mom_ids))
return self.momdb.getProjectDetails(ids)
return self.momdb.getProjectDetails(mom_ids)
def getProjects(self):
return self.momdb.getProjects()
def getPredecessorIds(self, mom_ids):
return self.momdb.getPredecessorIds(mom_ids)
def getSuccessorIds(self, mom_ids):
return self.momdb.getSuccessorIds(mom_ids)
def createService(busname=DEFAULT_MOMQUERY_BUSNAME,
servicename=DEFAULT_MOMQUERY_SERVICENAME,
dbcreds=None,
......@@ -207,7 +279,7 @@ def createService(busname=DEFAULT_MOMQUERY_BUSNAME,
return Service(servicename,
handler,
busname=busname,
numthreads=2,
numthreads=1,
use_service_methods=True,
verbose=False,
broker=broker,
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment