Ejemplo n.º 1
0
def delete_testset(testset_id):
    testset = db.query(TestSet).get(testset_id)
    if not testset:
        abort(404)

    testset.clean_up()
    db.delete(testset)
    db.commit()

    return '', 204
Ejemplo n.º 2
0
def delete_embedding(embedding_id):
    embedding = db.query(Embedding).get(embedding_id)
    if not embedding:
        abort(404)

    embedding.clean_up()
    db.delete(embedding)
    db.commit()

    return '', 204
Ejemplo n.º 3
0
def delete_result(embedding_id, testset_id):
    result = db.query(Result).get((embedding_id, testset_id))
    if not result:
        abort(404)

    # Delete its testing_job first.
    db.delete(result.testing_job)
    db.delete(result)

    db.commit()

    return '', 204
Ejemplo n.º 4
0
def delete_testing_job(testing_job_id):
    testing_job = db.query(TestingJob).get(testing_job_id)
    if not testing_job:
        abort(404)

    # If it has any result associated, delete it.
    result = db.query(Result).get((
        testing_job.embedding_id,
        testing_job.testset_id
    ))
    if result:
        db.delete(result)

    if testing_job.task_id:
        celery_app.control.revoke(testing_job.task_id, terminate=True)

    db.delete(testing_job)
    db.commit()

    return '', 204
Ejemplo n.º 5
0
def create_testing_job():
    data = request.get_json(force=True)
    if 'embedding_id' not in data or 'testset_id' not in data:
        abort(400)

    embedding_id = data['embedding_id']
    testset_id = data['testset_id']

    if not (isinstance(embedding_id, int) or isinstance(testset_id, int)):
        return jsonify({
            'message': "At least one ID must be specified",
            'error': 'Bad Request'
        }), 400

    # Build a list of embeddings and testsets to test.
    embeddings = []
    testsets = []
    if isinstance(embedding_id, int):
        embedding = db.query(Embedding).get(embedding_id)
        if not embedding:
            abort(404)
        embeddings.append(embedding)

        if isinstance(testset_id, int):
            testset = db.query(TestSet).get(testset_id)
            testsets.append(testset)
        elif testset_id == 'full':
            testsets.extend(db.query(TestSet).all())
        elif testset_id == 'missing':
            existing = db.query(TestSet.id).join(Result).join(Embedding)\
                         .filter(Embedding.id == embedding_id)
            query = db.query(TestSet).filter(~TestSet.id.in_(existing))
            testsets.extend(query.all())

    elif isinstance(testset_id, int):
        testset = db.query(TestSet).get(testset_id)
        if not testset:
            abort(404)
        testsets.append(testset)

        if isinstance(embedding_id, int):
            embedding = db.query(Embedding).get(embedding_id)
            embeddings.append(embedding)
        elif embedding_id == 'full':
            embeddings.extend(db.query(Embedding).all())
        elif embedding_id == 'missing':
            existing = db.query(Embedding.id).join(Result).join(TestSet)\
                         .filter(TestSet.id == testset_id)
            query = db.query(Embedding).filter(~Embedding.id.in_(existing))
            embeddings.extend(query.all())

    # Make sure there are no Nones (i.e. all the models exist).
    if any([emb is None for emb in embeddings]):
        abort(404)
    if any([ts is None for ts in testsets]):
        abort(404)

    # Make sure the embeddings are trained already.
    embeddings = filter(lambda e: e.status == 'TRAINED', embeddings)

    # For each pair <embedding, testset>, create the necessary TestingJob,
    # deleting it first if it already exists. Also delete associated results.
    jobs = []
    for embedding in embeddings:
        for testset in testsets:
            job = db.query(TestingJob)\
                    .filter_by(embedding=embedding, testset=testset)\
                    .first()
            if job and job.status in ['PENDING', 'PROGRESS']:
                # Only overwrite TestingJobs that have already run. If it's
                # still pending or running right now, we want to keep it.
                continue
            elif job:
                for result in job.results.all():
                    db.delete(result)
                db.delete(job)

            job = TestingJob(testset=testset, embedding=embedding)
            jobs.append(job)
            db.add(job)

    db.commit()

    for job in jobs:
        test.delay(job.id)

    return jsonify(data={'testing_job_id': [job.id for job in jobs]})