From 948e08e66643ec644a6a1d9d87f45b53c00dd0e9 Mon Sep 17 00:00:00 2001 From: Daysgone <79004213+Days-gone@users.noreply.github.com> Date: Thu, 18 Jan 2024 14:05:42 +0000 Subject: [PATCH 1/3] add: group_by_city --- README.md | 4 ++-- src/backend/dao.py | 15 +++++++++++++++ src/backend/routers.py | 6 ++++++ src/backend/services.py | 4 ++++ 4 files changed, 27 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index f8f2586..4df9272 100644 --- a/README.md +++ b/README.md @@ -31,12 +31,12 @@ poetry add packagename ### 项目启动 -```bash + ```bash poetry install diff --git a/src/backend/dao.py b/src/backend/dao.py index 012b2c4..acc3711 100644 --- a/src/backend/dao.py +++ b/src/backend/dao.py @@ -1,6 +1,7 @@ from typing import List from sqlalchemy.orm import Session +from sqlalchemy import func from .models import Job @@ -8,3 +9,17 @@ def get(session: Session, offset=0, limit=100) -> List[Job]: result = session.query(Job).offset(offset).limit(limit).all() return result + + +def count(session: Session, key: str) -> dict: + valid_keys = ["city"] + if key not in valid_keys: + return {} + group_by_column = getattr(Job, key) + result = ( + session.query(group_by_column, func.count(Job.id)) + .group_by(group_by_column) + .all() + ) + result = sorted(result, key=lambda x: x[1], reverse=True) + return {item[0]: item[1] for item in result} diff --git a/src/backend/routers.py b/src/backend/routers.py index 34ec922..f14fe2f 100644 --- a/src/backend/routers.py +++ b/src/backend/routers.py @@ -1,4 +1,5 @@ from fastapi import APIRouter, Depends +from fastapi.responses import JSONResponse from sqlalchemy.orm import Session from . import db, schemas, services @@ -19,3 +20,8 @@ def get_session(): @router.get("/jobs", response_model=list[schemas.JobSchema]) def get_jobs(session: Session = Depends(get_session)): return services.get_jobs(session) + + +@router.get("/analyze/{item}") +def get_analyze(session: Session = Depends(get_session), item: str | None = None): + return services.group_and_count(session, item) diff --git a/src/backend/services.py b/src/backend/services.py index 1213d1e..998e8ed 100644 --- a/src/backend/services.py +++ b/src/backend/services.py @@ -5,3 +5,7 @@ def get_jobs(session: Session): return dao.get(session) + + +def group_and_count(session: Session, key: str): + return dao.count(session, key) From cc766366b3887eb47a11590dac4425ac471a6fbf Mon Sep 17 00:00:00 2001 From: Daysgone <79004213+Days-gone@users.noreply.github.com> Date: Thu, 18 Jan 2024 15:12:24 +0000 Subject: [PATCH 2/3] add: add group count by language --- src/backend/dao.py | 13 +++++++++++-- src/backend/services.py | 7 ++++++- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/backend/dao.py b/src/backend/dao.py index acc3711..2cd53e7 100644 --- a/src/backend/dao.py +++ b/src/backend/dao.py @@ -11,8 +11,17 @@ def get(session: Session, offset=0, limit=100) -> List[Job]: return result -def count(session: Session, key: str) -> dict: - valid_keys = ["city"] +def keyword_count(session: Session, keyword: str | None = '') -> int: + ''' + for now only for position keyword count + ''' + result = session.query(Job).filter(Job.position.like(f"%{keyword}%")).count() + print(f'{keyword} : {result}') + return result + + +def group_count(session: Session, key: str) -> dict: + valid_keys = ["city", "education"] if key not in valid_keys: return {} group_by_column = getattr(Job, key) diff --git a/src/backend/services.py b/src/backend/services.py index 998e8ed..edf4f51 100644 --- a/src/backend/services.py +++ b/src/backend/services.py @@ -8,4 +8,9 @@ def get_jobs(session: Session): def group_and_count(session: Session, key: str): - return dao.count(session, key) + if key == "position": + print("hehe") + lang = ["python", "java", "c++", "go", "ruby"] + return {item: dao.keyword_count(session, item) for item in lang} + + return dao.group_count(session, key) From 94ded47a7aa4936bad53f7f88b6a44264df2b164 Mon Sep 17 00:00:00 2001 From: Daysgone <79004213+Days-gone@users.noreply.github.com> Date: Fri, 19 Jan 2024 14:08:53 +0000 Subject: [PATCH 3/3] add position filter --- src/backend/dao.py | 14 +++++--------- src/backend/routers.py | 7 ++++++- src/backend/schemas.py | 17 +++++++++++++++++ src/backend/services.py | 14 +++++++++----- 4 files changed, 37 insertions(+), 15 deletions(-) diff --git a/src/backend/dao.py b/src/backend/dao.py index 2cd53e7..e07c212 100644 --- a/src/backend/dao.py +++ b/src/backend/dao.py @@ -11,15 +11,6 @@ def get(session: Session, offset=0, limit=100) -> List[Job]: return result -def keyword_count(session: Session, keyword: str | None = '') -> int: - ''' - for now only for position keyword count - ''' - result = session.query(Job).filter(Job.position.like(f"%{keyword}%")).count() - print(f'{keyword} : {result}') - return result - - def group_count(session: Session, key: str) -> dict: valid_keys = ["city", "education"] if key not in valid_keys: @@ -32,3 +23,8 @@ def group_count(session: Session, key: str) -> dict: ) result = sorted(result, key=lambda x: x[1], reverse=True) return {item[0]: item[1] for item in result} + + +def filtered_select(session: Session, exist: str) -> list[Job]: + result = session.query(Job).filter(Job.position.like(f"%{exist}%")).all() + return result diff --git a/src/backend/routers.py b/src/backend/routers.py index f14fe2f..551c104 100644 --- a/src/backend/routers.py +++ b/src/backend/routers.py @@ -22,6 +22,11 @@ def get_jobs(session: Session = Depends(get_session)): return services.get_jobs(session) -@router.get("/analyze/{item}") +@router.get("/analyze/{item}", response_class=JSONResponse) def get_analyze(session: Session = Depends(get_session), item: str | None = None): return services.group_and_count(session, item) + + +@router.get("/position/{spec}",response_model=list[schemas.SimpleJobSchema]) +def get_certain_position(session: Session = Depends(get_session), spec: str = "python"): + return services.get_filtered_position(session, spec) \ No newline at end of file diff --git a/src/backend/schemas.py b/src/backend/schemas.py index 577b56c..269c13b 100644 --- a/src/backend/schemas.py +++ b/src/backend/schemas.py @@ -17,3 +17,20 @@ class JobSchema(BaseModel): financing_stage: Annotated[str, StringConstraints(max_length=128)] company_size: Annotated[str, StringConstraints(max_length=128)] welfare: Annotated[str, StringConstraints(max_length=128)] + + +class SimpleJobSchema(BaseModel): + model_config = ConfigDict(from_attributes=True) + + position: Annotated[str, StringConstraints(max_length=128)] + city: Annotated[str, StringConstraints(max_length=128)] + area: Annotated[str, StringConstraints(max_length=128)] + salary: Annotated[str, StringConstraints(max_length=128)] + # tag: Annotated[str, StringConstraints(max_length=128)] + education: Annotated[str, StringConstraints(max_length=128)] + experience: Annotated[str, StringConstraints(max_length=128)] + company_name: Annotated[str, StringConstraints(max_length=128)] + # industry: Annotated[str, StringConstraints(max_length=128)] + # financing_stage: Annotated[str, StringConstraints(max_length=128)] + # company_size: Annotated[str, StringConstraints(max_length=128)] + # welfare: Annotated[str, StringConstraints(max_length=128)] \ No newline at end of file diff --git a/src/backend/services.py b/src/backend/services.py index edf4f51..f873350 100644 --- a/src/backend/services.py +++ b/src/backend/services.py @@ -8,9 +8,13 @@ def get_jobs(session: Session): def group_and_count(session: Session, key: str): - if key == "position": - print("hehe") - lang = ["python", "java", "c++", "go", "ruby"] - return {item: dao.keyword_count(session, item) for item in lang} - + if key not in ["city", "education"]: + return {} return dao.group_count(session, key) + + +def get_filtered_position(session: Session, spec: str): + current_pos = ["python", "ruby", "java", "c++"] + if spec not in current_pos: + return [] + return dao.filtered_select(session, spec)