diff --git a/docker-compose.yml b/docker-compose.yml index f84d117..7a66a0c 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -9,6 +9,7 @@ services: volumes: # when pushing to server, remove the first dot here in front of /mnt - /mnt/ssd/ds_ftp/classla_OS2022:/usr/src/app/classla_OS2022 - ../classla/classla_resources:/root/classla_resources + - ../jobs_database_rsdo5:/usr/src/app/DB environment: - PYTHONUNBUFFERED=1 - MDB_DATABASE=conllus_150k diff --git a/rsdo5.json b/rsdo5.json index 464fd83..e939521 100644 --- a/rsdo5.json +++ b/rsdo5.json @@ -546,7 +546,7 @@ } }, { - "name": "kljucnebesede", + "name": "kljucneBesede", "in": "query", "required": false, "schema": { @@ -616,7 +616,18 @@ } }, { - "name": "kljucnebesede", + "name": "kljucneBesede", + "in": "query", + "required": false, + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + }, + { + "name": "prepovedaneBesede", "in": "query", "required": false, "schema": { @@ -688,7 +699,18 @@ } }, { - "name": "kljucnebesede", + "name": "kljucneBesede", + "in": "query", + "required": false, + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + }, + { + "name": "prepovedaneBesede", "in": "query", "required": false, "schema": { @@ -757,7 +779,7 @@ } }, { - "name": "kljucnebesede", + "name": "kljucneBesede", "in": "query", "required": false, "schema": { @@ -869,7 +891,7 @@ } }, { - "name": "kljucnebesede", + "name": "kljucneBesede", "in": "query", "required": false, "schema": { @@ -1004,7 +1026,7 @@ } }, { - "name": "kljucnebesede", + "name": "kljucneBesede", "in": "query", "required": false, "schema": { diff --git a/swagger_server/DB/.gitignore b/swagger_server/DB/.gitignore new file mode 100644 index 0000000..86d0cb2 --- /dev/null +++ b/swagger_server/DB/.gitignore @@ -0,0 +1,4 @@ +# Ignore everything in this directory +* +# Except this file +!.gitignore \ No newline at end of file diff --git a/swagger_server/__main__.py b/swagger_server/__main__.py index a00597f..12a62d9 100644 --- a/swagger_server/__main__.py +++ b/swagger_server/__main__.py @@ -7,6 +7,7 @@ from swagger_server import encoder def main(): app = connexion.App(__name__, specification_dir='./swagger/') app.app.json_encoder = encoder.JSONEncoder + app.app.config['JSON_SORT_KEYS'] = False app.add_api('swagger.yaml', arguments={'title': 'OpenAPI definition'}, pythonic_params=True) app.run(port=8080) diff --git a/swagger_server/controllers/jobs_controller.py b/swagger_server/controllers/jobs_controller.py index 658ae11..a818eda 100644 --- a/swagger_server/controllers/jobs_controller.py +++ b/swagger_server/controllers/jobs_controller.py @@ -243,7 +243,9 @@ def execute_classla_job(job: Job): classla_sem.acquire() job.started_on = datetime.datetime.utcnow() job.save() - conllu, _ = cl_utils.raw_text_to_conllu(job.job_input) + conllu, status = cl_utils.raw_text_to_conllu(job.job_input) + if status != 200: + conllu = f'ERROR - {conllu}' job.job_output = conllu job.finished_on = datetime.datetime.utcnow() job.save() @@ -268,7 +270,7 @@ def execute_ateapi_job(job: Job): try: ret_json = _res.response[0].decode('utf-8') except: - ret_json = "Unknown exception." + ret_json = "ERROR - Unknown exception." if _res.status_code != 200: ret_json = f'ERROR - {ret_json}' @@ -287,8 +289,8 @@ def execute_izluscipoiskanju_job(job: Job): job.started_on = datetime.datetime.utcnow() job.save() info = json.loads(job.job_input) - terKand = db_utils.vrni_oss_terminoloske_kandidate(info['leta'], info['vrste'], info['kljucnebesede'], - info['udk']) + terKand = db_utils.vrni_oss_terminoloske_kandidate(info['leta'], info['vrste'], info['kljucne_besede'], + info['prepovedane_besede'], info['udk']) job.job_output = terKand job.finished_on = datetime.datetime.utcnow() job.save() diff --git a/swagger_server/controllers/oss_controller.py b/swagger_server/controllers/oss_controller.py index ffc02f3..160a8cd 100644 --- a/swagger_server/controllers/oss_controller.py +++ b/swagger_server/controllers/oss_controller.py @@ -8,7 +8,7 @@ from swagger_server import util from flask import send_file -def get_conllus(leta=None, vrste=None, kljucnebesede=None, udk=None): # noqa: E501 +def get_conllus(leta=None, vrste=None, kljucne_besede=None, udk=None): # noqa: E501 """"Vrne seznam CoNNL-U-jev glede na iskalne pogoje # noqa: E501 @@ -17,22 +17,22 @@ def get_conllus(leta=None, vrste=None, kljucnebesede=None, udk=None): # noqa: E :type leta: List[int] :param vrste: :type vrste: List[int] - :param kljucnebesede: - :type kljucnebesede: List[str] + :param kljucne_besede: + :type kljucne_besede: List[str] :param udk: :type udk: List[str] :rtype: List[str] """ - if not kljucnebesede: + if not kljucne_besede: return "Manjkajo kljucne besede", 400 - files = db_utils.get_files_by_udc(kljucnebesede) + files = db_utils.get_files_by_udc(kljucne_besede) if not files: return 'Nobena datoteka ne ustreza iskalnemu pogoju', 404 return ' '.join(files), 200 -def get_extracted_words(leta=None, vrste=None, kljucnebesede=None, udk=None): # noqa: E501 +def get_extracted_words(leta=None, vrste=None, kljucne_besede=None, prepovedane_besede=None, udk=None): # noqa: E501 """Vrne terminloške kandidate glede na ... (sync) # noqa: E501 @@ -41,18 +41,21 @@ def get_extracted_words(leta=None, vrste=None, kljucnebesede=None, udk=None): # :type leta: List[int] :param vrste: :type vrste: List[int] - :param kljucnebesede: - :type kljucnebesede: List[str] + :param kljucne_besede: + :type kljucne_besede: List[str] + :param prepovedane_besede: + :type prepovedane_besede: List[str] :param udk: :type udk: List[str] :rtype: List[TerminoloskiKandidat] """ - terKand = db_utils.vrni_oss_terminoloske_kandidate(leta, vrste, kljucnebesede, udk) + terKand = db_utils.vrni_oss_terminoloske_kandidate(leta, vrste, kljucne_besede, prepovedane_besede, udk) return terKand, 200 -def get_extracted_words_async(leta=None, vrste=None, kljucnebesede=None, udk=None): # noqa: E501 +def get_extracted_words_async(leta=None, vrste=None, kljucne_besede=None, prepovedane_besede=None, + udk=None): # noqa: E501 """Vrne terminloške kandidate glede na ... (async) # noqa: E501 @@ -61,22 +64,25 @@ def get_extracted_words_async(leta=None, vrste=None, kljucnebesede=None, udk=Non :type leta: List[int] :param vrste: :type vrste: List[int] - :param kljucnebesede: - :type kljucnebesede: List[str] + :param kljucne_besede: + :type kljucne_besede: List[str] + :param prepovedane_besede: + :type prepovedane_besede: List[str] :param udk: :type udk: List[str] :rtype: str """ job, is_old_job = JobManager.create_job(5, json.dumps( - {'leta': leta, 'vrste': vrste, 'kljucnebesede': kljucnebesede, 'udk': udk})) + {'leta': leta, 'vrste': vrste, 'kljucne_besede': kljucne_besede, 'prepovedane_besede': prepovedane_besede, + 'udk': udk})) if job is None: return "Something went wrong", 500 ret = {'check_job_url': f'{connexion.request.url_root}/job/{job.id}'} return ret, 200 -def get_files(leta=None, vrste=None, kljucnebesede=None, udk=None): # noqa: E501 +def get_files(leta=None, vrste=None, kljucne_besede=None, udk=None): # noqa: E501 """Vrne seznam binarnih zapisov v originalnem formatu glede na iskalne pogoje # noqa: E501 @@ -85,22 +91,22 @@ def get_files(leta=None, vrste=None, kljucnebesede=None, udk=None): # noqa: E50 :type leta: List[int] :param vrste: :type vrste: List[int] - :param kljucnebesede: - :type kljucnebesede: List[str] + :param kljucne_besede: + :type kljucne_besede: List[str] :param udk: :type udk: List[str] :rtype: str """ - if not kljucnebesede: + if not kljucne_besede: return "Manjkajo kljucne besede", 400 - files = db_utils.get_files_by_udc(kljucnebesede) + files = db_utils.get_files_by_udc(kljucne_besede) if not files: return 'Nobena datoteka ne ustreza iskalnemu pogoju', 404 return ' '.join(files), 200 -def get_number_texts(leta=None, vrste=None, kljucnebesede=None, udk=None): # noqa: E501 +def get_number_texts(leta=None, vrste=None, kljucne_besede=None, udk=None): # noqa: E501 """Vrne število besedil glede na iskalne pogoje # noqa: E501 @@ -109,8 +115,8 @@ def get_number_texts(leta=None, vrste=None, kljucnebesede=None, udk=None): # no :type leta: List[int] :param vrste: :type vrste: List[int] - :param kljucnebesede: - :type kljucnebesede: List[str] + :param kljucne_besede: + :type kljucne_besede: List[str] :param udk: :type udk: List[str] @@ -119,29 +125,29 @@ def get_number_texts(leta=None, vrste=None, kljucnebesede=None, udk=None): # no # if not kljucnebesede: # return "Manjkajo kljucne besede", 400 - files = db_utils.vrni_oss_dokumente(leta, vrste, kljucnebesede, udk) + files = db_utils.vrni_oss_dokumente(leta, vrste, kljucne_besede, udk) return len(files), 200 -def get_texts(leta, vrste, kljucnebesede, cerifpodrocja): # noqa: E501 +def get_texts(leta=None, vrste=None, kljucne_besede=None, udk=None): # noqa: E501 """Vrne seznam besedil glede na iskalne pogoje # noqa: E501 - :param leta: + :param leta: :type leta: List[int] - :param vrste: + :param vrste: :type vrste: List[int] - :param kljucnebesede: - :type kljucnebesede: List[str] + :param kljucne_besede: + :type kljucne_besede: List[str] :param udk: :type udk: List[str] :rtype: List[str] """ - if not kljucnebesede: + if not kljucne_besede: return "Manjkajo kljucne besede", 400 - files = db_utils.get_files_by_udc(kljucnebesede) + files = db_utils.get_files_by_udc(kljucne_besede) if not files: return 'Nobena datoteka ne ustreza iskalnemu pogoju', 404 return ' '.join(files), 200 diff --git a/swagger_server/requets_db/models/vrsta.py b/swagger_server/requets_db/models/vrsta.py index 438efa5..5ad54d7 100644 --- a/swagger_server/requets_db/models/vrsta.py +++ b/swagger_server/requets_db/models/vrsta.py @@ -7,22 +7,14 @@ import os from swagger_server.util import get_random_filename from werkzeug.utils import secure_filename -LOCAL_PATH = "requets_db/dbs" -SERVER_PATH = "swagger_server/requets_db/dbs" - -if not os.path.exists(LOCAL_PATH): - if os.path.exists('requets_db'): - os.makedirs(LOCAL_PATH, exist_ok=True) - elif os.path.exists('swagger_server/requets_db'): - os.makedirs(SERVER_PATH, exist_ok=True) - -DB = f'{LOCAL_PATH}/jobs.db' -if not os.path.exists(LOCAL_PATH): - DB = f'{SERVER_PATH}/jobs.db' -db = SqliteDatabase(DB, pragmas={ - # 'journal_mode': 'wal', - 'cache_size': -1 * 128 * 1024, # 128MB - 'foreign_keys': 1 +DB_Path = 'DB/jobs.db' +if not os.path.exists('DB'): + os.makedirs('DB', exist_ok=True) +db = SqliteDatabase(DB_Path, pragmas={ + 'journal_mode': 'wal', + 'cache_size': -1 * 256 * 1024, # 256MB + 'foreign_keys': 1, + 'charset': 'utf8' }) diff --git a/swagger_server/swagger/swagger.yaml b/swagger_server/swagger/swagger.yaml index b4a8379..c68ede3 100644 --- a/swagger_server/swagger/swagger.yaml +++ b/swagger_server/swagger/swagger.yaml @@ -311,7 +311,7 @@ paths: items: type: integer format: int64 - - name: kljucnebesede + - name: kljucneBesede in: query required: false style: form @@ -366,7 +366,16 @@ paths: items: type: integer format: int64 - - name: kljucnebesede + - name: kljucneBesede + in: query + required: false + style: form + explode: true + schema: + type: array + items: + type: string + - name: prepovedaneBesede in: query required: false style: form @@ -422,7 +431,16 @@ paths: items: type: integer format: int64 - - name: kljucnebesede + - name: kljucneBesede + in: query + required: false + style: form + explode: true + schema: + type: array + items: + type: string + - name: prepovedaneBesede in: query required: false style: form @@ -459,7 +477,7 @@ paths: parameters: - name: leta in: query - required: true + required: false style: form explode: true schema: @@ -469,25 +487,7 @@ paths: format: int64 - name: vrste in: query - required: true - style: form - explode: true - schema: - type: array - items: - type: string - - name: kljucnebesede - in: query - required: true - style: form - explode: true - schema: - type: array - items: - type: string - - name: cerifpodrocja - in: query - required: true + required: false style: form explode: true schema: @@ -495,6 +495,24 @@ paths: items: type: integer format: int64 + - name: kljucneBesede + in: query + required: false + style: form + explode: true + schema: + type: array + items: + type: string + - name: udk + in: query + required: false + style: form + explode: true + schema: + type: array + items: + type: string responses: "200": description: OK @@ -563,7 +581,7 @@ paths: items: type: integer format: int64 - - name: kljucnebesede + - name: kljucneBesede in: query required: false style: form @@ -667,7 +685,7 @@ paths: items: type: integer format: int64 - - name: kljucnebesede + - name: kljucneBesede in: query required: false style: form diff --git a/swagger_server/utils/cl_utils.py b/swagger_server/utils/cl_utils.py index d9a75e1..5020be2 100644 --- a/swagger_server/utils/cl_utils.py +++ b/swagger_server/utils/cl_utils.py @@ -10,8 +10,11 @@ nlp_loaded = True sent_extractor = re.compile(r"# sent_id = \d+\.\d+(.*?)\n\n", re.MULTILINE | re.DOTALL) + def raw_text_to_conllu(text): try: + if text == '' or text is None: + raise Exception("Text can not be empty (when trying to make conllu for it)") docall = nlpSlo(text) docallconllu = docall.to_conll() diff --git a/swagger_server/utils/db_utils.py b/swagger_server/utils/db_utils.py index 0fc6a8b..cc432d3 100644 --- a/swagger_server/utils/db_utils.py +++ b/swagger_server/utils/db_utils.py @@ -33,7 +33,7 @@ def get_files_by_udc(udc): return ret -def vrni_oss_dokumente(leta, vrste, kljucnebesede, udk): +def vrni_oss_dokumente(leta, vrste, kljucne_besede, udk): ret = [] try: @@ -66,12 +66,12 @@ def vrni_oss_dokumente(leta, vrste, kljucnebesede, udk): where=where + " tipologija IN (%s) " % (where_in_vrste) params=params+vrste - if (kljucnebesede): + if (kljucne_besede): if (where): where=where+ " AND " - where_in_kb = ','.join(['%s'] * len(kljucnebesede)) + where_in_kb = ','.join(['%s'] * len(kljucne_besede)) where=where + " kljucnabeseda IN (%s) " % (where_in_kb) - params=params+kljucnebesede + params=params+kljucne_besede if(where): sql=sql+" where " + where + ";" @@ -91,7 +91,7 @@ def vrni_oss_dokumente(leta, vrste, kljucnebesede, udk): return ret -def vrni_oss_terminoloske_kandidate(leta, vrste, kljucnebesede, udk): +def vrni_oss_terminoloske_kandidate(leta, vrste, kljucne_besede, prepovedane_besede, udk): ret = [] try: @@ -124,12 +124,12 @@ def vrni_oss_terminoloske_kandidate(leta, vrste, kljucnebesede, udk): where=where + " tipologija IN (%s) " % (where_in_vrste) params=params+vrste - if (kljucnebesede): + if (kljucne_besede): if (where): where=where+ " AND " - where_in_kb = ','.join(['%s'] * len(kljucnebesede)) + where_in_kb = ','.join(['%s'] * len(kljucne_besede)) where=where + " kljucnabeseda IN (%s) " % (where_in_kb) - params=params+kljucnebesede + params=params+kljucne_besede if(where): sql=sql+" where " + where