diff --git a/app/corpora/events.py b/app/corpora/events.py index fef105d5..974792f6 100644 --- a/app/corpora/events.py +++ b/app/corpora/events.py @@ -3,7 +3,8 @@ from app.events import connected_sessions from app.models import Corpus from flask import current_app, request from flask_login import current_user, login_required -from .CQiWrapper.CQiWrapper import CQiWrapper +from .CQiWrapper.CQiClient import CQiClient +from .CQiWrapper.CQi import CONST_FIELD_MATCH, CONST_FIELD_MATCHEND ''' @@ -40,17 +41,32 @@ def init_corpus_analysis(corpus_id): def recv_query(message): logger.warning(message) analysis_client = analysis_clients[request.sid] - corpus_name = 'CORPUS' - result_subcorpus_name = 'Query-results' # should be set by the user somehow - query = message['query'] - analysis_client.set_corpus_name(corpus_name) - analysis_client.create_attribute_strings() - analysis_client.query_subcorpus(result_subcorpus_name, query) - logger.warning('Vorher') - #results = analysis_client.show_results() - results = analysis_client.get_cpos_info([1995, 2000], analysis_client) - logger.warning('Nacher') - logger.warning('Query results: {}'.format(str(results))) + """ Prepare and execute a query """ + corpus = 'CORPUS' + query = '"and";' + query_subcorpus = 'Results' + analysis_client.cqp_query(corpus, query_subcorpus, query) + """ Evaluate query results """ + match_corpus = '{}:{}'.format(corpus, query_subcorpus) + match_num = analysis_client.cqp_subcorpus_size(match_corpus) + match_num = min(19, match_num) + if match_num == 0: + print('No matches found.') + exit() + if not analysis_client.cqp_subcorpus_has_field(match_corpus, CONST_FIELD_MATCH): + print('Error.') + exit() + if not analysis_client.cqp_subcorpus_has_field(match_corpus, CONST_FIELD_MATCHEND): + print('Error') + exit() + match_boundaries = zip(analysis_client.cqp_dump_subcorpus(match_corpus, CONST_FIELD_MATCH, 0, match_num - 1), + analysis_client.cqp_dump_subcorpus(match_corpus, CONST_FIELD_MATCHEND, 0, match_num - 1)) + matches = [] + for match_start, match_end in match_boundaries: + tokens = analysis_client.cl_cpos2str('{}.word'.format(corpus), range(match_start, match_end + 1)) + pos = analysis_client.cl_cpos2str('{}.pos'.format(corpus), range(match_start, match_end + 1)) + matches.append({'tokens': tokens, 'pos': pos}) + logger.warning(matches) def observe_corpus_analysis_connection(app, corpus_id, session_id): @@ -59,10 +75,8 @@ def observe_corpus_analysis_connection(app, corpus_id, session_id): while corpus.status != 'analysing': db.session.refresh(corpus) socketio.sleep(3) - analysis_client = CQiWrapper(host='{}_analysis_container{}'.format(corpus.creator.username, corpus.id), - password='opaque', port=4877, - username='opaque') - analysis_client.connect() + analysis_client = CQiClient(host='{}_analysis_container{}'.format(corpus.creator.username, corpus.id), port=4877) + analysis_client.ctrl_connect('opaque', 'opaque') analysis_clients[session_id] = analysis_client socketio.emit('init_corpus_analysis', 'Ready', room=session_id) while session_id in connected_sessions: @@ -76,7 +90,7 @@ def observe_corpus_analysis_connection(app, corpus_id, session_id): socketio.sleep(3) ''' socketio.sleep(3) - analysis_client.disconnect() + analysis_client.ctrl_bye() analysis_clients.pop(session_id, None) analysis_sessions[str(corpus_id)].remove(session_id) if not analysis_sessions[str(corpus_id)]: