File size: 5,502 Bytes
fc2963d
 
 
 
 
 
 
 
2f46275
21a58f8
91b6537
fc2963d
 
2f46275
fc2963d
 
2f46275
fc2963d
 
 
 
 
 
 
91b6537
fc2963d
 
 
 
 
 
 
 
 
2f46275
fc2963d
 
2f46275
fc2963d
 
 
2f46275
fc2963d
 
 
 
91b6537
fc2963d
 
2f46275
91b6537
fc2963d
2f46275
fc2963d
 
 
 
 
 
 
 
2538c23
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
# modules/database/morphosyntax_iterative_mongo_db.py

from datetime import datetime, timezone
import logging
from .mongo_db import get_collection, insert_document, find_documents, update_document, delete_document

logger = logging.getLogger(__name__)

# Nombres de colecciones manteniendo coherencia
BASE_COLLECTION = 'student_morphosyntax_analysis_base'
ITERATION_COLLECTION = 'student_morphosyntax_iterations'

def store_student_morphosyntax_base(username, text, arc_diagrams):
    """Almacena el análisis morfosintáctico base"""
    try:
        base_document = {
            'username': username,  # key principal
            'timestamp': datetime.now(timezone.utc).isoformat(),
            'text': text,
            'arc_diagrams': arc_diagrams,
            'analysis_type': 'morphosyntax_base',
            'has_iterations': False
        }
        
        collection = get_collection(BASE_COLLECTION)
        result = collection.insert_one(base_document)
        logger.info(f"Análisis base guardado para {username}")
        return str(result.inserted_id)
        
    except Exception as e:
        logger.error(f"Error almacenando análisis base: {str(e)}")
        return None

def store_student_morphosyntax_iteration(username, base_id, original_text, iteration_text, arc_diagrams):
    """Almacena una iteración de análisis morfosintáctico"""
    try:
        iteration_document = {
            'username': username,  # key principal
            'base_id': base_id,
            'timestamp': datetime.now(timezone.utc).isoformat(),
            'original_text': original_text,
            'iteration_text': iteration_text,
            'arc_diagrams': arc_diagrams,
            'analysis_type': 'morphosyntax_iteration'
        }
        
        collection = get_collection(ITERATION_COLLECTION)
        result = collection.insert_one(iteration_document)
        
        # Actualizar documento base
        base_collection = get_collection(BASE_COLLECTION)
        base_collection.update_one(
            {'_id': base_id, 'username': username},  # incluir username en queries
            {'$set': {'has_iterations': True}}
        )
        
        logger.info(f"Iteración guardada para {username}, base_id: {base_id}")
        return str(result.inserted_id)
        
    except Exception as e:
        logger.error(f"Error almacenando iteración: {str(e)}")
        return None

def get_student_morphosyntax_analysis(username, limit=10):
    """
    Obtiene los análisis base y sus iteraciones
    Returns: Lista de análisis con sus iteraciones
    """
    try:
        # Obtener análisis base
        base_collection = get_collection(BASE_COLLECTION)
        base_query = {
            "username": username,
            "analysis_type": "morphosyntax_base"
        }
        base_analyses = list(base_collection.find(base_query).sort("timestamp", -1).limit(limit))
        
        # Para cada análisis base, obtener sus iteraciones
        iteration_collection = get_collection(ITERATION_COLLECTION)
        for analysis in base_analyses:
            base_id = analysis['_id']
            iterations = list(iteration_collection.find({"base_id": base_id}).sort("timestamp", -1))
            analysis['iterations'] = iterations
            
        return base_analyses
        
    except Exception as e:
        logger.error(f"Error obteniendo análisis: {str(e)}")
        return []

def update_student_morphosyntax_analysis(analysis_id, is_base, update_data):
    """
    Actualiza un análisis base o iteración
    """
    try:
        collection_name = BASE_COLLECTION if is_base else ITERATION_COLLECTION
        collection = get_collection(collection_name)
        
        query = {"_id": analysis_id}
        update = {"$set": update_data}
        
        result = update_document(collection_name, query, update)
        return result
        
    except Exception as e:
        logger.error(f"Error actualizando análisis: {str(e)}")
        return False

def delete_student_morphosyntax_analysis(analysis_id, is_base):
    """
    Elimina un análisis base o iteración
    Si es base, también elimina todas sus iteraciones
    """
    try:
        if is_base:
            # Primero eliminar todas las iteraciones
            iteration_collection = get_collection(ITERATION_COLLECTION)
            iteration_collection.delete_many({"base_id": analysis_id})
            
            # Luego eliminar el análisis base
            collection = get_collection(BASE_COLLECTION)
        else:
            collection = get_collection(ITERATION_COLLECTION)
            
        query = {"_id": analysis_id}
        result = delete_document(collection.name, query)
        return result
        
    except Exception as e:
        logger.error(f"Error eliminando análisis: {str(e)}")
        return False

def get_student_morphosyntax_data(username):
    """
    Obtiene todos los datos de análisis morfosintáctico de un estudiante
    Returns: Diccionario con todos los análisis y sus iteraciones
    """
    try:
        analyses = get_student_morphosyntax_analysis(username, limit=None)
        return {
            'entries': analyses,
            'total_analyses': len(analyses),
            'has_iterations': any(a.get('has_iterations', False) for a in analyses)
        }
        
    except Exception as e:
        logger.error(f"Error obteniendo datos del estudiante: {str(e)}")
        return {'entries': [], 'total_analyses': 0, 'has_iterations': False}