functions/sync-review-comments-db/main.py (48 lines of code) (raw):
import logging
import functions_framework
from database import init_connection_pool_engine
from models import (
Evaluation,
Suggestion,
)
from qdrant_client import QdrantClient
from sqlalchemy import select
from sqlalchemy.orm import Session
from bugbug.tools import code_review
from bugbug.utils import get_secret
from bugbug.vectordb import QdrantVectorDB
logging.basicConfig()
logging.getLogger("sqlalchemy.engine").setLevel(logging.INFO)
pg_engine = init_connection_pool_engine()
qdrant_client = QdrantClient(
location=get_secret("QDRANT_LOCATION"), api_key=get_secret("QDRANT_API_KEY")
)
def get_recent_evaluations(min_id: int):
with Session(pg_engine) as session:
stmt = (
select(Evaluation, Suggestion)
.join(Suggestion)
.where(Evaluation.id > min_id)
)
evaluations = session.scalars(stmt)
yield from evaluations
@functions_framework.cloud_event
def event_handler(cloud_event):
vector_db = QdrantVectorDB("suggestions_feedback")
vector_db.setup()
largest_evaluation_id = vector_db.get_largest_id()
logging.info(
"Retrieving evaluations from the PostgreSQL database starting from evaluation ID %d",
largest_evaluation_id,
)
feedback_db = code_review.SuggestionsFeedbackDB(vector_db)
feedback_db.add_suggestions_feedback(
code_review.SuggestionFeedback(
id=evaluation.id,
action=evaluation.action.name,
comment=evaluation.suggestion.content,
file_path=evaluation.suggestion.file_path,
user=evaluation.user,
)
for evaluation in get_recent_evaluations(largest_evaluation_id)
)