def METHOD_NAME():
    start = time.time()
    job_id = admin_api.start_job()
    job_outcome = None
    trace_back_string = None
    if not job_id:
        logger.info("Failed to get job_id")
        return "busy"
    try:
        log_db.log_exec_status(job_id, "start_flow", "executing", "")
        with engine.begin() as conn:
            # Here's how we match:
            # 1. Clear pdp_contacts (the old matches).
            # 2. Go through each raw data source table (e.g. salesforcecontacts,
            #    volgistics) and copy the latest data for each contact into
            #    pdp_contacts.
            # 3. Execute a join of pdp_contacts to itself using names, emails,
            #    phone numbers, etc. to get a list of pairs of pdp_contacts ids
            #    that "match."
            # 4. Join manual_matches to pdp_contacts to get the pdp_contacts ids
            #    of our manual matches.
            #
            # Steps 3 and 4 both produce lists of pairs of ids. Next we need to
            # associate an id with each group of matches. Note that if A matches
            # B and B matches C, then A and C should get the same match id. We
            # can thus think of "matches" as edges in a graph of id vertices,
            # and match groups as connected components in that graph. So:
            #
            # 5. Load all the matches into a Graph() and compute its connected
            #    components.
            # 6. Update each row in pdp_contacts to give it a match id
            #    corresponding to its connected componenet.
            logger.debug("Clearing pdp_contacts to prepare for match")
            reset_pdp_contacts_with_unmatched(conn)
            logger.debug("Computing automatic matches")
            automatic_matches = get_automatic_matches(conn)
            logger.debug("Computing manual matches")
            manual_matches = get_manual_matches(conn)
            match_graph = Graph()
            logger.debug("Adding automatic matches to graph")
            match_graph.add_edges_from(automatic_matches)
            logger.debug("Adding manual matches to graph")
            match_graph.add_edges_from(manual_matches)
            logger.debug("Processing graph")
            match_groups = connected_components(match_graph)
            logger.debug("Updating pdp_contacts with match ids")
            update_matching_ids(match_groups, conn)
            logger.debug("Finished flow script run")
            job_outcome = "completed"
            log_db.log_exec_status(job_id, "flow", "complete", "")
    except Exception as e:
        logger.error(e)
        trace_back_string = traceback.format_exc()
        logger.error(trace_back_string)
    finally:
        if job_outcome != "completed":
            log_db.log_exec_status(job_id, "flow", "error", trace_back_string)
            logger.error(
                "Uncaught error status, setting job status to 'error' "
            )
            job_outcome = "error"
            return "error"
    logger.info(
        "Pipeline execution took %s seconds ", format(time.time() - start)
    )
    return job_outcome