You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
63 lines
2.5 KiB
63 lines
2.5 KiB
from typing import List
|
|
|
|
from sqlalchemy.orm import Session
|
|
from sqlalchemy.sql.expression import func
|
|
from sqlalchemy import inspect
|
|
|
|
from . import models, schemas
|
|
from .database import Base
|
|
|
|
|
|
def get_item(db: Session, item_id: int):
|
|
"""индивидуальные страницы для каждого Описания набора данных"""
|
|
return db.query(models.Item).filter(models.Item.id == item_id).first()
|
|
|
|
|
|
def get_item_by_description(db: Session, needle: str, skip: int = 0, limit: int = 20):
|
|
"""фильтры для поиска Описаний наборов данных по атрибутам
|
|
дополнительный возможный синтаксис в запросах преобразуется
|
|
в поисковый запрос содержащий:
|
|
- простой текст: переданные слова в любом порядке
|
|
- "текст в кавычках": переданные слова в указанном порядке
|
|
- OR: какие-либо из переданных слов
|
|
- -: не содержащий данного слова
|
|
"""
|
|
# hardcode russian for now
|
|
# built-in postgress websearch_to_tsquery() is good
|
|
# https://www.postgresql.org/docs/11/textsearch-controls.html#TEXTSEARCH-PARSING-QUERIES
|
|
# TODO: add requested search columns [0]
|
|
items_table = inspect(models.Item).local_table
|
|
result = (
|
|
db.query(models.Item)
|
|
.filter(
|
|
items_table.c.geodata_search_ts.op("@@")(func.websearch_to_tsquery('"russian"', needle))
|
|
)
|
|
.order_by(items_table.c.id)
|
|
.offset(skip)
|
|
.limit(limit)
|
|
.all()
|
|
)
|
|
return result
|
|
|
|
|
|
def get_items(db: Session, skip: int = 0, limit: int = 20):
|
|
"""список доступных в системе Описаний наборов данных"""
|
|
return db.query(models.Item).offset(skip).limit(limit).all()
|
|
|
|
|
|
def insert_items(db: Session, items: List[schemas.ItemCreate]):
|
|
"""импорт в базу данных Описаний наборов данных"""
|
|
before = db.query(models.Item).count()
|
|
accepted = len(items)
|
|
# https://docs.sqlalchemy.org/en/14/dialects/postgresql.html#psycopg2-fast-execution-helpers
|
|
modeled_items = (models.ItemCreate(**item.dict()) for item in items)
|
|
db.add_all(modeled_items)
|
|
db.commit()
|
|
inserted = db.query(models.Item).count() - before
|
|
return (accepted, inserted)
|
|
|
|
|
|
def get_headers(db: Session):
|
|
"""полные заголовки таблиц"""
|
|
return db.query(models.Header).all()
|