-
-
Notifications
You must be signed in to change notification settings - Fork 1
/
operaindice.cpp
216 lines (195 loc) · 9.28 KB
/
operaindice.cpp
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
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
// vim: set expandtab tabstop=8 shiftwidth=8 foldmethod=marker:
/** @file operaindice.cpp
* Realiza operaciones en un índice:
* - Listar palabras de un índice con la frecuencia
* lista i
* - Generar árbol en formato dotty
* grafo i
* - Generar otro árbol en formato dotty
* grafo2 i
* - Genera condensado de índice
* condensado i
* - Mezcla en ram los índices i1 a i_n y deja el resultado en is
* mezclaram is i1 i2 ... i_n
* - Mezcla en disco el índice i1 con el índice i2 y deja el resultado en is
* mezcladisco is i1 i2
* - Indexar y añadir textos a indice i con dominio d y dejar resultado en o.
* indexa i d a -salida o
* - Mezclar con otro índice y dejar resultado en un tercer archivo.
* o Añadir un índice
* i1 d -aumenta i2 -salida i3
* - Eliminar uno o más documentos
* i d -elimina d1 -elimina d2 ... -elimina d_n
* - Renumerar referencias a documento
* i -renumera d1 d2 -renumera d3 d4 ...
* - Generar el subíndice correspondiente a un documento
* subindice i d
* - Mezclar subíndice en índice manteniendo numeración
* i -mezcla i2 d2
*
* @package Mt77
* @author Vladimir Támara Patiño. vtamara@pasosdeJesus.org
* Dominio público. 2009. Sin garantías
* http://creativecommons.org/licenses/publicdomain/
* @version $Id: operaindice.cpp,v 1.16 2010/03/08 12:02:40 vtamara Exp $
*/
/**
* Dominio público. 2009. vtamara@pasosdejesus.org
*/
#include <iostream>
#include <iomanip>
#include <list>
#include <vector>
#include <fstream>
#include <istream>
using namespace std;
#include "RamDisco.hpp"
#include "Operaciones.hpp"
bool metainformacion=true;
int main(int argc, char *argv[])
{
if (argc < 2) {
cerr<<"Se esperaba operación y parámetros" << endl;
cerr<<"Las operaciones posibles y sus parámetros son:" << endl;
cerr << endl;
cerr << "eliminadoc is i n" << endl;
cerr << " Elimina el n-esimo documento del índice i (n>=1) produciendo is" << endl;
cerr << "grafo i" << endl;
cerr << " Generar árbol en formato dotty" << endl;
cerr << "grafo2 i" << endl;
cerr << " Generar otro árbol en formato dotty" << endl;
cerr << "condensado i" << endl;
cerr << " Generar condensado" << endl;
cerr << "lista i" << endl;
cerr << " Lista palabras de un índice con frecuencia" << endl;
cerr << "mezclaram is i1 i2 ... i_n" << endl;
cerr << " Mezcla en ram índices i1 e i2 produciendo is" << endl;
cerr << "mezcladisco is i1 i2 [n]" << endl;
cerr << " Mezcla en disco. Análogo a mezclaram, aunque el parametro opcional n " << endl;
cerr << " índica la posición en medio de documentos referenciados por i1, " << endl;
cerr << " en la que se insertarán documentos referenciados " << endl;
cerr << " por i2. Si no se especifica se insertan después de los de i1. " << endl;
cerr << " Puede ser entre 1 y el total de documentos de i1 más 1" << endl;
/* Esto lo hace indexador
* cerr << "agregadoc is i1 pref d [n]" << endl;
cerr << " Usando como prefijo para URL pref, indexa el documento d en RAM y " << endl;
cerr << " lo mezcla con el índice i1, dejando el índice resultante en is." << endl;
cerr << " El parámetro n es como en mezcladisco " << endl;
*/
cerr << "subindice is i n" << endl;
cerr << " Saca del índice i el subíndice que corresponde al documento n " << endl;
cerr << " y lo escribe en is" << endl;
exit(1);
}
char noma[1000];
char nrel[MAXLURL];
if (((strcmp(argv[1], "lista") == 0 ||
strcmp(argv[1], "grafo") == 0 ||
strcmp(argv[1], "grafo2") == 0 ||
strcmp(argv[1], "condensado") == 0) &&
argc != 3) ||
(strcmp(argv[1], "subindice") == 0 && argc != 5) ||
(strcmp(argv[1], "eliminadoc") == 0 && argc != 5) ||
(strcmp(argv[1], "mezclaram") == 0 && argc < 5) ||
// (strcmp(argv[1], "agregadoc") == 0 && argc != 6 && argc != 7) ||
(strcmp(argv[1], "mezcladisco") == 0 &&
(argc < 5 || argc>6))) {
cerr << "Cantidad de parámetros incorrecta" << endl;
exit(1);
}
try {
if (strcmp(argv[1], "eliminadoc") == 0) {
snprintf(noma, 1000, "%s", argv[2]);
long nd = atoi(argv[4]);
if (nd <= 0) {
cerr << "n debe ser mayor o igual a 1" << endl;
exit(1);
}
eliminaDoc(noma, argv[3], (long)nd);
} else if (strcmp(argv[1], "grafo") == 0) {
snprintf(noma, 1000, "%s", argv[2]);
verificaNombre(argv[2], nrel);
vector<Doc> docs1;
NodoTrieS *r = leePlano(noma, nrel, docs1);
r->aDotty(cout);
} else if (strcmp(argv[1], "grafo2") == 0) {
snprintf(noma, 1000, "%s", argv[2]);
verificaNombre(argv[2], nrel);
vector<Doc> docs1;
NodoTrieS *r = leePlano(noma, nrel, docs1);
r->aDotty2();
} else if (strcmp(argv[1], "condensado") == 0) {
snprintf(noma, 1000, "%s", argv[2]);
verificaNombre(argv[2], nrel);
cout << condensado(argv[2], false) << endl;
} else if (strcmp(argv[1], "lista") == 0) {
snprintf(noma, 1000, "%s", argv[2]);
verificaNombre(argv[2], nrel);
listaPalabras(noma, nrel);
} else if (strcmp(argv[1], "mezclaram") == 0) {
NodoTrieS *t = NULL;
snprintf(noma, 1000, "%s", argv[2]);
//cerr<<"noma="<<noma<<endl;
vector<Doc> docs2;
for (int i = 3; i < argc; i++) {
vector<Doc> docs1; // Documentos en i-esimo índ.
verificaNombre(argv[i], nrel);
NodoTrieS *r = leePlano(argv[i], nrel, docs1);
// Renumera los del r
// Mezcla docs1 en docs2
vector<int64_t> renum =
mezclaDocs(docs1, docs2);
if (r != NULL) {
r->renumeraDocs(renum);
}
NodoTrieS *t2=mezcla(t, r);
t = t2;
r = NULL;
}
//cerr<<"idocs.size="<<idocs.size()<<endl;
verificaNombre(noma, nrel);
escribePlano(*t, docs2, noma, nrel);
} else if (strcmp(argv[1], "mezcladisco") == 0) {
/* Mezcla 2 tries en disco */
long nd = 0;
if (argc == 6) {
nd = atoi(argv[5]);
if (nd < 1) {
cerr << "n debe ser mayor o igual a 1" << endl;
exit(1);
}
}
mezclaDosDisco(argv[2], argv[3], argv[4], nd);
/* } else if (strcmp(argv[1], "agregadoc") == 0) {
long nd = 0;
if (argc == 7) {
nd = atoi(argv[6]);
if (nd < 1) {
cerr << "n debe ser mayor o igual a 1" << endl;
exit(1);
}
}
try {
agregaDoc(argv[2], argv[3], argv[5],
metainformacion, argv[4], nd);
} catch (std::string s) {
cerr << s << endl;
exit(1);
} */
} else if (strcmp(argv[1], "subindice") == 0) {
long nd = atoi(argv[4]);
if (nd < 1) {
cerr << "n debe ser mayor o igual a 1" << endl;
exit(1);
}
subindice(argv[3], argv[2], nd);
} else {
cerr << "operación desconocida " << argv[1] << endl;
return 1;
}
} catch (string s) {
cerr << s << endl;
return 1;
}
return 0;
}