"""Docstring.""" import argparse import csv def main(): # parse cli args parser = argparse.ArgumentParser( formatter_class=argparse.ArgumentDefaultsHelpFormatter ) parser.add_argument( 'filename', help='Input CSV data' ) parser.add_argument( 'command', choices=[ 's3_cp', 'neo4j_merge', 'neo4j_match', 'neo4j_delete' ], help='Type of commands or queries to output' ) args = parser.parse_args() # read in data from input file try: with open(args.filename, 'r') as f: reader = csv.DictReader(f) rows = [ { 'filename': x['filename'], 'extension': x['filename'].split('.')[1], 'file_id': x['filename'].split('.')[0], 'tuid': x['track_unique_id'] } for x in reader ] except KeyError as e: print(f'Missing column {e}') print('Invalid input csv!') exit(1) # generate output commands output = globals()[args.command](rows) # calculate how much to shift output min_indent = None for x in output: for y in x.split('\n'): indent = len(y) - len(y.lstrip(' ')) if not min_indent or indent < min_indent: min_indent = indent # print shifted output shift_indent = ' ' * min_indent for x in output: for y in x.split('\n'): print(y.replace(shift_indent, '', 1)) def s3_cp(rows): prod = 'prod-orcd-mezzanine-assets' qa = 'qa-orcd-mezzanine-assets' return [ f"aws s3 cp s3://{prod}/{row['filename']} s3://{qa}/{row['filename']}" for row in rows ] def neo4j_merge(rows): return [ f""" MATCH (tr:Track) WHERE tr.id = {row['tuid']} MERGE (oa:OrchardAsset {{ filename: '{row['file_id']}', extension: '{row['extension']}', source: 'ows-assets-db' }} ) ON CREATE SET oa.id = apoc.create.uuid() WITH tr,oa MERGE (tr)-[x:HAS_ASSET]->(oa) WITH tr OPTIONAL MATCH (tr)-[oldHa:HAS_ASSET]->(ea:OrchardAsset) WHERE ea.source <> 'ows-assets-db' CALL apoc.refactor.setType(oldHa, 'DELETED_HAS_ASSET') YIELD output RETURN true ; """ for row in rows ] def neo4j_match(rows): tuid_str = ','.join([ row['tuid'] for row in rows ]) return [ f""" MATCH (tr:Track)<-[z:INCLUDES]-(pr:Product)<-[a:INCLUDES]-(pj:Project)-[b:BELONGS_TO]->(v:Vendor) WHERE tr.id IN [{tuid_str}] OPTIONAL MATCH (oa:OrchardAsset)<-[x:HAS_ASSET|DELETED_HAS_ASSET]-(tr) OPTIONAL MATCH (oa)-[y:FINGERPRINTED_AS]->(acr:ACRID) OPTIONAL MATCH (acr)<-[i:CONTAINS_FINGERPRINT]-(osr:OrchardSoundRecording) RETURN * ; """ ] def neo4j_delete(rows): return [ x.replace('RETURN *', 'DETACH DELETE oa,acr,osr') for x in neo4j_match(rows) ] if __name__ == '__main__': main()