mirror of
				https://gitlab.ub.uni-bielefeld.de/sfb1288inf/nopaque.git
				synced 2025-11-04 04:12:45 +00:00 
			
		
		
		
	Improve cqi extension structure
This commit is contained in:
		@@ -8,17 +8,11 @@ from typing import Callable, Dict, List
 | 
			
		||||
from app import socketio
 | 
			
		||||
from app.decorators import socketio_login_required
 | 
			
		||||
from . import NAMESPACE as ns
 | 
			
		||||
from .extensions import (
 | 
			
		||||
    corpus_update_db,
 | 
			
		||||
    corpus_static_data,
 | 
			
		||||
    corpus_paginate_corpus,
 | 
			
		||||
    cqp_paginate_subcorpus,
 | 
			
		||||
    cqp_partial_export_subcorpus,
 | 
			
		||||
    cqp_export_subcorpus,
 | 
			
		||||
)
 | 
			
		||||
from .extensions import CQI_EXTENSION_FUNCTION_NAMES
 | 
			
		||||
from . import extensions as extensions_module
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
CQI_API_FUNCTIONS: List[str] = [
 | 
			
		||||
CQI_FUNCTION_NAMES: List[str] = [
 | 
			
		||||
    'ask_feature_cl_2_3',
 | 
			
		||||
    'ask_feature_cqi_1_0',
 | 
			
		||||
    'ask_feature_cqp_2_3',
 | 
			
		||||
@@ -64,14 +58,6 @@ CQI_API_FUNCTIONS: List[str] = [
 | 
			
		||||
    'ctrl_ping',
 | 
			
		||||
    'ctrl_user_abort'
 | 
			
		||||
]
 | 
			
		||||
CQI_NOPAQUE_FUNCTIONS: Dict[str, Callable] = {
 | 
			
		||||
    'nopaque_corpus_update_db': corpus_update_db,
 | 
			
		||||
    'nopaque_corpus_static_data': corpus_static_data,
 | 
			
		||||
    'nopaque_corpus_paginate_corpus': corpus_paginate_corpus,
 | 
			
		||||
    'nopaque_cqp_paginate_subcorpus': cqp_paginate_subcorpus,
 | 
			
		||||
    'nopaque_cqp_partial_export_subcorpus': cqp_partial_export_subcorpus,
 | 
			
		||||
    'nopaque_cqp_export_subcorpus': cqp_export_subcorpus,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@socketio.on('cqi', namespace=ns)
 | 
			
		||||
@@ -88,11 +74,11 @@ def cqi_over_sio(fn_data):
 | 
			
		||||
        cqi_client_lock: Lock = session['cqi_over_sio']['cqi_client_lock']
 | 
			
		||||
    except KeyError:
 | 
			
		||||
        return {'code': 424, 'msg': 'Failed Dependency'}
 | 
			
		||||
    if fn_name in CQI_API_FUNCTIONS:
 | 
			
		||||
    if fn_name in CQI_FUNCTION_NAMES:
 | 
			
		||||
        fn: Callable = getattr(cqi_client.api, fn_name)
 | 
			
		||||
    elif fn_name in CQI_NOPAQUE_FUNCTIONS:
 | 
			
		||||
    elif fn_name in CQI_EXTENSION_FUNCTION_NAMES:
 | 
			
		||||
        fn_args['cqi_client'] = cqi_client
 | 
			
		||||
        fn: Callable = CQI_NOPAQUE_FUNCTIONS[fn_name]
 | 
			
		||||
        fn: Callable = getattr(extensions_module, fn_name)
 | 
			
		||||
    else:
 | 
			
		||||
        return {'code': 400, 'msg': 'Bad Request'}
 | 
			
		||||
    for param in signature(fn).parameters.values():
 | 
			
		||||
 
 | 
			
		||||
@@ -1,17 +1,28 @@
 | 
			
		||||
from collections import Counter
 | 
			
		||||
from cqi import CQiClient
 | 
			
		||||
from cqi.models.corpora import Corpus
 | 
			
		||||
from cqi.status import StatusOk
 | 
			
		||||
from flask import session
 | 
			
		||||
from typing import Dict
 | 
			
		||||
from typing import Dict, List
 | 
			
		||||
import json
 | 
			
		||||
import math
 | 
			
		||||
import os
 | 
			
		||||
from app import db
 | 
			
		||||
from app.models import Corpus
 | 
			
		||||
from .utils import lookups_by_cpos, export_subcorpus, partial_export_subcorpus
 | 
			
		||||
from .utils import lookups_by_cpos, partial_export_subcorpus, export_subcorpus
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def corpus_update_db(cqi_client: CQiClient, corpus: str):
 | 
			
		||||
CQI_EXTENSION_FUNCTION_NAMES: List[str] = [
 | 
			
		||||
    'ext_corpus_update_db',
 | 
			
		||||
    'ext_corpus_static_data',
 | 
			
		||||
    'ext_corpus_paginate_corpus',
 | 
			
		||||
    'ext_cqp_paginate_subcorpus',
 | 
			
		||||
    'ext_cqp_partial_export_subcorpus',
 | 
			
		||||
    'ext_cqp_export_subcorpus',
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def ext_corpus_update_db(cqi_client: CQiClient, corpus: str):
 | 
			
		||||
    db_corpus = Corpus.query.get(session['cqi_over_sio']['corpus_id'])
 | 
			
		||||
    cqi_corpus = cqi_client.corpora.get(corpus)
 | 
			
		||||
    db_corpus.num_tokens = cqi_corpus.size
 | 
			
		||||
@@ -19,7 +30,7 @@ def corpus_update_db(cqi_client: CQiClient, corpus: str):
 | 
			
		||||
    return StatusOk()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def corpus_static_data(cqi_client: CQiClient, corpus: str) -> Dict:
 | 
			
		||||
def ext_corpus_static_data(cqi_client: CQiClient, corpus: str) -> Dict:
 | 
			
		||||
    db_corpus = Corpus.query.get(session['cqi_over_sio']['corpus_id'])
 | 
			
		||||
    static_corpus_data_file = os.path.join(db_corpus.path, 'cwb', 'static.json')
 | 
			
		||||
    if os.path.exists(static_corpus_data_file):
 | 
			
		||||
@@ -125,7 +136,7 @@ def corpus_static_data(cqi_client: CQiClient, corpus: str) -> Dict:
 | 
			
		||||
    return static_corpus_data
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def corpus_paginate_corpus(
 | 
			
		||||
def ext_corpus_paginate_corpus(
 | 
			
		||||
    cqi_client: CQiClient,
 | 
			
		||||
    corpus: str,
 | 
			
		||||
    page: int = 1,
 | 
			
		||||
@@ -170,7 +181,7 @@ def corpus_paginate_corpus(
 | 
			
		||||
    return payload
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def cqp_paginate_subcorpus(
 | 
			
		||||
def ext_cqp_paginate_subcorpus(
 | 
			
		||||
    cqi_client: CQiClient,
 | 
			
		||||
    subcorpus: str,
 | 
			
		||||
    context: int = 50,
 | 
			
		||||
@@ -218,7 +229,7 @@ def cqp_paginate_subcorpus(
 | 
			
		||||
    return payload
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def cqp_partial_export_subcorpus(
 | 
			
		||||
def ext_cqp_partial_export_subcorpus(
 | 
			
		||||
    cqi_client: CQiClient,
 | 
			
		||||
    subcorpus: str,
 | 
			
		||||
    match_id_list: list,
 | 
			
		||||
@@ -231,7 +242,7 @@ def cqp_partial_export_subcorpus(
 | 
			
		||||
    return cqi_subcorpus_partial_export
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def cqp_export_subcorpus(
 | 
			
		||||
def ext_cqp_export_subcorpus(
 | 
			
		||||
    cqi_client: CQiClient,
 | 
			
		||||
    subcorpus: str,
 | 
			
		||||
    context: int = 50
 | 
			
		||||
@@ -1,6 +1,7 @@
 | 
			
		||||
from typing import Dict, List
 | 
			
		||||
from cqi.models.corpora import Corpus
 | 
			
		||||
from cqi.models.subcorpora import Subcorpus
 | 
			
		||||
from typing import Dict, List
 | 
			
		||||
from app.models import Corpus
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def lookups_by_cpos(corpus: Corpus, cpos_list: List[int]) -> Dict:
 | 
			
		||||
@@ -617,8 +617,8 @@ cqi.api.APIClient = class APIClient {
 | 
			
		||||
   * @param {string} corpus
 | 
			
		||||
   * @returns {Promise<cqi.status.StatusOk>}
 | 
			
		||||
   */
 | 
			
		||||
  async corpus_update_db(corpus) {
 | 
			
		||||
    const fn_name = 'nopaque_corpus_update_db';
 | 
			
		||||
  async ext_corpus_update_db(corpus) {
 | 
			
		||||
    const fn_name = 'ext_corpus_update_db';
 | 
			
		||||
    const fn_args = {corpus: corpus};
 | 
			
		||||
    let payload = await this.#request(fn_name, fn_args);
 | 
			
		||||
    return new cqi.status.lookup[payload.code]();
 | 
			
		||||
@@ -628,8 +628,8 @@ cqi.api.APIClient = class APIClient {
 | 
			
		||||
   * @param {string} corpus
 | 
			
		||||
   * @returns {Promise<object>}
 | 
			
		||||
   */
 | 
			
		||||
  async corpus_static_data(corpus) {
 | 
			
		||||
    const fn_name = 'nopaque_corpus_static_data';
 | 
			
		||||
  async ext_corpus_static_data(corpus) {
 | 
			
		||||
    const fn_name = 'ext_corpus_static_data';
 | 
			
		||||
    const fn_args = {corpus: corpus};
 | 
			
		||||
    return await this.#request(fn_name, fn_args);
 | 
			
		||||
  }
 | 
			
		||||
@@ -640,8 +640,8 @@ cqi.api.APIClient = class APIClient {
 | 
			
		||||
   * @param {number=} per_page
 | 
			
		||||
   * @returns {Promise<object>}
 | 
			
		||||
   */
 | 
			
		||||
  async corpus_paginate_corpus(corpus, page, per_page) {
 | 
			
		||||
    const fn_name = 'nopaque_corpus_paginate_corpus';
 | 
			
		||||
  async ext_corpus_paginate_corpus(corpus, page, per_page) {
 | 
			
		||||
    const fn_name = 'ext_corpus_paginate_corpus';
 | 
			
		||||
    const fn_args = {corpus: corpus}
 | 
			
		||||
    if (page !== undefined) {fn_args.page = page;}
 | 
			
		||||
    if (per_page !== undefined) {fn_args.per_page = per_page;}
 | 
			
		||||
@@ -655,8 +655,8 @@ cqi.api.APIClient = class APIClient {
 | 
			
		||||
   * @param {number=} per_page
 | 
			
		||||
   * @returns {Promise<object>}
 | 
			
		||||
   */
 | 
			
		||||
  async cqp_paginate_subcorpus(subcorpus, context, page, per_page) {
 | 
			
		||||
    const fn_name = 'nopaque_cqp_paginate_subcorpus';
 | 
			
		||||
  async ext_cqp_paginate_subcorpus(subcorpus, context, page, per_page) {
 | 
			
		||||
    const fn_name = 'ext_cqp_paginate_subcorpus';
 | 
			
		||||
    const fn_args = {subcorpus: subcorpus}
 | 
			
		||||
    if (context !== undefined) {fn_args.context = context;}
 | 
			
		||||
    if (page !== undefined) {fn_args.page = page;}
 | 
			
		||||
@@ -670,8 +670,8 @@ cqi.api.APIClient = class APIClient {
 | 
			
		||||
   * @param {number=} context
 | 
			
		||||
   * @returns {Promise<object>}
 | 
			
		||||
   */
 | 
			
		||||
  async cqp_partial_export_subcorpus(subcorpus, match_id_list, context) {
 | 
			
		||||
    const fn_name = 'nopaque_cqp_partial_export_subcorpus';
 | 
			
		||||
  async ext_cqp_partial_export_subcorpus(subcorpus, match_id_list, context) {
 | 
			
		||||
    const fn_name = 'ext_cqp_partial_export_subcorpus';
 | 
			
		||||
    const fn_args = {subcorpus: subcorpus, match_id_list: match_id_list};
 | 
			
		||||
    if (context !== undefined) {fn_args.context = context;}
 | 
			
		||||
    return await this.#request(fn_name, fn_args);
 | 
			
		||||
@@ -682,8 +682,8 @@ cqi.api.APIClient = class APIClient {
 | 
			
		||||
   * @param {number=} context
 | 
			
		||||
   * @returns {Promise<object>}
 | 
			
		||||
   */
 | 
			
		||||
  async cqp_export_subcorpus(subcorpus, context) {
 | 
			
		||||
    const fn_name = 'nopaque_cqp_export_subcorpus';
 | 
			
		||||
  async ext_cqp_export_subcorpus(subcorpus, context) {
 | 
			
		||||
    const fn_name = 'ext_cqp_export_subcorpus';
 | 
			
		||||
    const fn_args = {subcorpus: subcorpus};
 | 
			
		||||
    if (context !== undefined) {fn_args.context = context;}
 | 
			
		||||
    return await this.#request(fn_name, fn_args);
 | 
			
		||||
 
 | 
			
		||||
@@ -99,7 +99,7 @@ cqi.models.corpora.Corpus = class Corpus extends cqi.models.resource.Model {
 | 
			
		||||
   * @returns {cqi.status.StatusOk}
 | 
			
		||||
   */
 | 
			
		||||
  async updateDb() {
 | 
			
		||||
    return await this.client.api.corpus_update_db(this.apiName);
 | 
			
		||||
    return await this.client.api.ext_corpus_update_db(this.apiName);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
@@ -108,7 +108,7 @@ cqi.models.corpora.Corpus = class Corpus extends cqi.models.resource.Model {
 | 
			
		||||
   * @returns {Promise<object>}
 | 
			
		||||
   */
 | 
			
		||||
  async paginate(page, per_page) {
 | 
			
		||||
    return await this.client.api.corpus_paginate_corpus(this.apiName, page, per_page);
 | 
			
		||||
    return await this.client.api.ext_corpus_paginate_corpus(this.apiName, page, per_page);
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@@ -122,16 +122,24 @@ cqi.models.corpora.CorpusCollection = class CorpusCollection extends cqi.models.
 | 
			
		||||
   * @returns {Promise<object>}
 | 
			
		||||
   */
 | 
			
		||||
  async _get(corpusName) {
 | 
			
		||||
    return {
 | 
			
		||||
    const returnValue = {
 | 
			
		||||
      api_name: corpusName,
 | 
			
		||||
      charset: await this.client.api.corpus_charset(corpusName),
 | 
			
		||||
      // full_name: await this.client.api.corpus_full_name(corpusName),
 | 
			
		||||
      // info: await this.client.api.corpus_info(corpusName),
 | 
			
		||||
      name: corpusName,
 | 
			
		||||
      properties: await this.client.api.corpus_properties(corpusName),
 | 
			
		||||
      size: await this.client.api.cl_attribute_size(`${corpusName}.word`),
 | 
			
		||||
      static_data: await this.client.api.corpus_static_data(corpusName),
 | 
			
		||||
    }
 | 
			
		||||
      size: await this.client.api.cl_attribute_size(`${corpusName}.word`)
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    /************************************************************************
 | 
			
		||||
     * NOTE: The following is not included in the CQi specification.        *
 | 
			
		||||
     ************************************************************************/
 | 
			
		||||
    /************************************************************************
 | 
			
		||||
     *                     Custom additions for nopaque                     *
 | 
			
		||||
     ************************************************************************/
 | 
			
		||||
    returnValue.static_data = await this.client.api.ext_corpus_static_data(corpusName);
 | 
			
		||||
    return returnValue;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
 
 | 
			
		||||
@@ -100,7 +100,7 @@ cqi.models.subcorpora.Subcorpus = class Subcorpus extends cqi.models.resource.Mo
 | 
			
		||||
   * @returns {Promise<object>}
 | 
			
		||||
   */
 | 
			
		||||
  async paginate(context, page, perPage) {
 | 
			
		||||
    return await this.client.api.cqp_paginate_subcorpus(this.apiName, context, page, perPage);
 | 
			
		||||
    return await this.client.api.ext_cqp_paginate_subcorpus(this.apiName, context, page, perPage);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
@@ -109,7 +109,7 @@ cqi.models.subcorpora.Subcorpus = class Subcorpus extends cqi.models.resource.Mo
 | 
			
		||||
   * @returns {Promise<object>}
 | 
			
		||||
   */
 | 
			
		||||
  async partialExport(matchIdList, context) {
 | 
			
		||||
    return await this.client.api.cqp_partial_export_subcorpus(this.apiName, matchIdList, context);
 | 
			
		||||
    return await this.client.api.ext_cqp_partial_export_subcorpus(this.apiName, matchIdList, context);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
@@ -117,7 +117,7 @@ cqi.models.subcorpora.Subcorpus = class Subcorpus extends cqi.models.resource.Mo
 | 
			
		||||
   * @returns {Promise<object>}
 | 
			
		||||
   */
 | 
			
		||||
  async export(context) {
 | 
			
		||||
    return await this.client.api.cqp_export_subcorpus(this.apiName, context);
 | 
			
		||||
    return await this.client.api.ext_cqp_export_subcorpus(this.apiName, context);
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user