Statistics
| Revision:

root / tmp / org.txm.groovy.core / src / groovy / org / txm / macro / commands / CrossedPartitionBuilderMacro.groovy @ 499

History | View | Annotate | Download (11.2 kB)

1 321 mdecorde
package org.txm.macro.commands
2 321 mdecorde
3 479 mdecorde
import org.kohsuke.args4j.*
4 479 mdecorde
5 321 mdecorde
import groovy.transform.Field
6 321 mdecorde
7 499 mdecorde
import org.txm.rcp.swt.widget.parameters.*
8 321 mdecorde
import org.txm.searchengine.cqp.corpus.*
9 479 mdecorde
import org.txm.utils.logger.Log;
10 499 mdecorde
import org.txm.rcp.views.*
11 321 mdecorde
12 321 mdecorde
//BEGINNING OF PARAMETERS
13 321 mdecorde
def corpus = corpusViewSelection
14 321 mdecorde
if (!(corpus instanceof Corpus)) {
15 321 mdecorde
        println "Error: this macro should be run with a Corpus selected"
16 321 mdecorde
        return
17 321 mdecorde
}
18 321 mdecorde
19 321 mdecorde
@Field @Option(name="structuralUnit", usage="the structural Unit to use", widget="String", required=true, def="text")
20 321 mdecorde
String structuralUnit = "text"
21 321 mdecorde
22 321 mdecorde
@Field @Option(name="structuralUnitPropertiesList", usage="the structural Unit properties list separated with commas", widget="String", required=true, def="p1,p2")
23 321 mdecorde
def structuralUnitPropertiesList = "loc, type";
24 321 mdecorde
25 321 mdecorde
//@Field @Option(name="expandTarget", usage="Expand structure", widget="String", required=false, def="")
26 321 mdecorde
def expandTarget = "";
27 321 mdecorde
28 321 mdecorde
//@Field @Option(name="structuralUnitToIgnore", usage="the structural Unit properties list to ignore separated with commas", widget="String", required=false, def="")
29 321 mdecorde
def structuralUnitToIgnore = "";
30 321 mdecorde
31 321 mdecorde
//@Field @Option(name="partitionName", usage="The partition name to use", widget="String", required=false, def="")
32 321 mdecorde
def partitionName = ""
33 321 mdecorde
34 321 mdecorde
//@Field @Option(name="partNamePrefix", usage="the part prefix to use", widget="String", required=true, def="")
35 321 mdecorde
def partNamePrefix = ""
36 321 mdecorde
37 321 mdecorde
@Field @Option(name="debug", usage="If debug, then show only queries", widget="Boolean", required=false, def="false")
38 321 mdecorde
def debug = true;
39 321 mdecorde
40 321 mdecorde
//Open the parameters input dialog box
41 321 mdecorde
if (!ParametersDialog.open(this)) return;
42 321 mdecorde
43 321 mdecorde
//END OF PARAMETERS
44 321 mdecorde
45 321 mdecorde
/**
46 321 mdecorde
 * Create partition with advanced CQL queries and autoname the parts.
47 321 mdecorde
 * Can create partitions by defining a multi-level structural units hierarchy or by defining several properties values for one structural unit.
48 321 mdecorde
 * Can define some structural units to remove from the resulting parts subcorpus.
49 321 mdecorde
 *
50 321 mdecorde
 */
51 321 mdecorde
52 321 mdecorde
// TODO: add this variables to the macro parameters
53 321 mdecorde
54 321 mdecorde
def structuralUnits = []
55 321 mdecorde
def structuralUnitProperties = []
56 321 mdecorde
structuralUnit = structuralUnit.trim()
57 321 mdecorde
structuralUnitPropertiesList = structuralUnitPropertiesList.trim()
58 321 mdecorde
59 321 mdecorde
// Build lists
60 321 mdecorde
def split = structuralUnit.split(",")
61 321 mdecorde
def split2 = structuralUnitPropertiesList.split(",")
62 321 mdecorde
if (split.size() == 1) {
63 321 mdecorde
        for (String p : split2) {
64 321 mdecorde
                p = p.trim();
65 321 mdecorde
                structuralUnits << structuralUnit
66 321 mdecorde
                structuralUnitProperties << p
67 321 mdecorde
        }
68 321 mdecorde
} else {
69 321 mdecorde
        if (split.size() == split2.size()) {
70 321 mdecorde
                for (int i = 0 ; i < split.size() ; i++) {
71 321 mdecorde
                        def su = split[i]
72 321 mdecorde
                        def p = split2[i];
73 321 mdecorde
                        structuralUnits << su
74 321 mdecorde
                        structuralUnitProperties << p
75 321 mdecorde
                }
76 321 mdecorde
        } else {
77 321 mdecorde
                println "Error: structuralUnitList size is different from structuralUnitPropertiesList"
78 321 mdecorde
                println "structuralUnitList=structuralUnitList=$structuralUnit structuralUnitPropertiesList=$structuralUnitPropertiesList"
79 321 mdecorde
                return false
80 321 mdecorde
        }
81 321 mdecorde
}
82 321 mdecorde
83 321 mdecorde
// check properties existance
84 321 mdecorde
try {
85 321 mdecorde
        boolean ok = true;
86 321 mdecorde
        for (int i = 0 ; i < structuralUnits.size() ; i++) {
87 321 mdecorde
                def suName = structuralUnits[i]
88 321 mdecorde
                def pName = structuralUnitProperties[i]
89 321 mdecorde
90 321 mdecorde
                if (corpus.getStructuralUnit(suName) == null) {
91 321 mdecorde
                        println "Error: no '$suName' structure in the '$corpus' corpus"
92 321 mdecorde
                        ok = false;
93 321 mdecorde
                } else {
94 321 mdecorde
                        def su = corpus.getStructuralUnit(suName)
95 321 mdecorde
                        for (String p : structuralUnitProperties) {
96 321 mdecorde
                                if (su.getProperty(pName) == null) {
97 321 mdecorde
                                        println "Error: no '$pName' structure property in the '$corpus' corpus"
98 321 mdecorde
                                        ok = false;
99 321 mdecorde
                                }
100 321 mdecorde
                        }
101 321 mdecorde
                }
102 321 mdecorde
        }
103 321 mdecorde
        if (!ok) return;
104 321 mdecorde
} catch(Exception e) {
105 321 mdecorde
        println "Error: $e"
106 321 mdecorde
        Log.printStackTrace(e)
107 321 mdecorde
        return
108 321 mdecorde
}
109 321 mdecorde
110 321 mdecorde
111 321 mdecorde
112 321 mdecorde
//Running
113 321 mdecorde
PartitionQueriesGenerator pqg = new PartitionQueriesGenerator();
114 321 mdecorde
try {
115 321 mdecorde
        def partition = pqg.createPartition(corpus, debug,
116 321 mdecorde
                        partitionName, partNamePrefix,
117 321 mdecorde
                        structuralUnits, structuralUnitProperties,
118 321 mdecorde
                        structuralUnitToIgnore, expandTarget);
119 321 mdecorde
120 321 mdecorde
        if (partition != null)        {
121 321 mdecorde
                monitor.syncExec(new Runnable() {
122 321 mdecorde
                                        public void run() {
123 321 mdecorde
                                                CorporaView.refresh();
124 321 mdecorde
                                                CorporaView.expand(partition.getParent());
125 321 mdecorde
                                        }
126 321 mdecorde
                                });
127 321 mdecorde
        }
128 321 mdecorde
} catch(Exception e) {
129 321 mdecorde
        println "Exception $e"
130 321 mdecorde
        Log.printStackTrace(e);
131 321 mdecorde
        return;
132 321 mdecorde
}
133 321 mdecorde
134 321 mdecorde
/**
135 321 mdecorde
 * Create a list of queries and part names regarding the structural units, structural units properties, structural units to ignore user defined lists and expand target value specified.
136 321 mdecorde
 * @author s
137 321 mdecorde
 *
138 321 mdecorde
 */
139 321 mdecorde
public class PartitionQueriesGenerator        {
140 321 mdecorde
141 321 mdecorde
        public boolean DEBUG = false;                                        // si DEBUG, alors les requêtes sont affichées mais la partition n'est pas créée
142 321 mdecorde
143 321 mdecorde
        public String PARTITION_NAME = "";                                // Nom de la partition (optionnel)
144 321 mdecorde
        public def STRUCTURAL_UNITS = [];                                // Liste des unités structurelles sur lesquelles effectuer la partition, ex: ['text', 'div1']
145 321 mdecorde
        public def STRUCTURAL_UNITS_PROPERTIES = [];        // Propriétés des unités structurelles sur lesquelles effectuer la partition, ex : ['id', 'name']
146 321 mdecorde
        public def STRUCTURAL_UNITS_TO_IGNORE = [];        // Structure à ignorer, ex. CQL : !speaker (optionnel)
147 321 mdecorde
        public String PART_NAMES_PREFIX = '';                        // Prefix pour les noms de partie (optionnel)
148 321 mdecorde
        public String EXPAND_TARGET = null;                        // Expand to target, englobe les empans jusqu'à la balise parente spécifiée.
149 321 mdecorde
        // NOTE : Le expand entre en conflit avec les sections à ignorer.
150 321 mdecorde
        // Si la target est à un niveau supérieur aux balises à ignorer, il les remet dans liste de résultats CWB et elles ne sont donc pas ignorées
151 321 mdecorde
152 321 mdecorde
        public def queries = [];
153 321 mdecorde
        public def partNames = [];
154 321 mdecorde
155 321 mdecorde
        /**
156 321 mdecorde
         * Init the generator and process.
157 321 mdecorde
         * @param corpusName
158 321 mdecorde
         */
159 321 mdecorde
        public Partition createPartition(Corpus corpus, boolean debug,
160 321 mdecorde
                        String partitionName, String partNamePrefix,
161 321 mdecorde
                        def structuralUnits, def structuralUnitProperties,
162 321 mdecorde
                        def structuralUnitToIgnore, String expandTarget)         {
163 321 mdecorde
164 321 mdecorde
                PARTITION_NAME = partitionName
165 321 mdecorde
                STRUCTURAL_UNITS = structuralUnits
166 321 mdecorde
                STRUCTURAL_UNITS_PROPERTIES = structuralUnitProperties
167 321 mdecorde
                STRUCTURAL_UNITS_TO_IGNORE = structuralUnitToIgnore
168 321 mdecorde
                PART_NAMES_PREFIX = partNamePrefix
169 321 mdecorde
                EXPAND_TARGET = expandTarget
170 321 mdecorde
                DEBUG = debug;
171 321 mdecorde
172 321 mdecorde
                if (DEBUG) {
173 321 mdecorde
                        println "Arguments: "
174 321 mdecorde
                        println "PARTITION_NAME = $PARTITION_NAME"
175 321 mdecorde
                        println "STRUCTURAL_UNITS = $STRUCTURAL_UNITS"
176 321 mdecorde
                        println "STRUCTURAL_UNITS_PROPERTIES = $STRUCTURAL_UNITS_PROPERTIES"
177 321 mdecorde
                        println "STRUCTURAL_UNITS_TO_IGNORE = $STRUCTURAL_UNITS_TO_IGNORE"
178 321 mdecorde
                        println "PART_NAMES_PREFIX = $PART_NAMES_PREFIX"
179 321 mdecorde
                        println "EXPAND_TARGET = $EXPAND_TARGET"
180 321 mdecorde
                        println "DEBUG = $DEBUG"
181 321 mdecorde
                }
182 321 mdecorde
183 321 mdecorde
                if (STRUCTURAL_UNITS.size() > 0 && STRUCTURAL_UNITS.size() == STRUCTURAL_UNITS_PROPERTIES.size())        {
184 321 mdecorde
185 321 mdecorde
                        if (DEBUG) println 'Creating the queries on corpus "' + corpus + "'" ;
186 321 mdecorde
                        if (DEBUG) println 'PARTITION_NAME: ' + PARTITION_NAME;
187 321 mdecorde
188 321 mdecorde
                        //Corpus corpus = CorpusManager.getCorpusManager().getCorpus(corpusName);
189 321 mdecorde
190 321 mdecorde
                        // Recursing through the corpus and subcorpus
191 321 mdecorde
                        process(corpus, 0, '', '');
192 321 mdecorde
193 321 mdecorde
                        // Displaying the queries
194 321 mdecorde
                        if (DEBUG) {
195 321 mdecorde
                                println "Queries processed: "
196 321 mdecorde
                                for (int i = 0 ; i < queries.size() ; i++) {
197 321 mdecorde
                                        println partNames[i] + " = " + queries[i]
198 321 mdecorde
                                }
199 321 mdecorde
                        }
200 321 mdecorde
201 321 mdecorde
                        // Finalizing the queries
202 321 mdecorde
                        finalizeQueries();
203 321 mdecorde
204 321 mdecorde
                        // Displaying the queries
205 321 mdecorde
                        if (DEBUG) {
206 321 mdecorde
                                println "Queries finalized: "
207 321 mdecorde
                                for (int i = 0 ; i < queries.size() ; i++) {
208 321 mdecorde
                                        println partNames[i] + " = " + queries[i]
209 321 mdecorde
                                }
210 321 mdecorde
                        }
211 321 mdecorde
212 321 mdecorde
                        if (DEBUG) println 'Queries created.';
213 321 mdecorde
214 321 mdecorde
                        // Creating the partition
215 321 mdecorde
                        if (!DEBUG  && queries.size() == partNames.size()) {
216 321 mdecorde
                                return corpus.createPartition(PARTITION_NAME, queries, partNames);
217 321 mdecorde
                        }
218 321 mdecorde
                } else {
219 321 mdecorde
                        println "Error: Structural units count or structural units properties count error.";
220 321 mdecorde
                        return null
221 321 mdecorde
                }
222 321 mdecorde
        }
223 321 mdecorde
224 321 mdecorde
        /**
225 321 mdecorde
         * Recurse through structural units and structural units properties of corpus and create the queries and the part names.
226 321 mdecorde
         * @param corpus the corpus or subcorpus
227 321 mdecorde
         * @param index the index for recursion
228 321 mdecorde
         * @param tmpQuery the temporary query for creating subcorpus part
229 321 mdecorde
         * @param tmpPartName the temporary part name of the subcorpus part
230 321 mdecorde
         */
231 321 mdecorde
        protected void process(Corpus corpus, int index, String tmpQuery, String tmpPartName)        {
232 321 mdecorde
                // End of array
233 321 mdecorde
                if (index >= STRUCTURAL_UNITS.size()) {
234 321 mdecorde
235 321 mdecorde
                        queries.add(tmpQuery);
236 321 mdecorde
                        partNames.add(PART_NAMES_PREFIX + tmpPartName);
237 321 mdecorde
238 321 mdecorde
                        return;
239 321 mdecorde
                }
240 321 mdecorde
241 321 mdecorde
                StructuralUnit su = corpus.getStructuralUnit(STRUCTURAL_UNITS[index]);
242 321 mdecorde
                StructuralUnitProperty sup = su.getProperty(STRUCTURAL_UNITS_PROPERTIES[index]);
243 321 mdecorde
244 321 mdecorde
                if (DEBUG) {
245 321 mdecorde
                        if (index == 0)        {
246 321 mdecorde
                                println 'Pocessing Structural Unit Property "' + sup.getFullName() + '" on mother corpus "' + corpus.getName() + '"';
247 321 mdecorde
                        } else {
248 321 mdecorde
                                println 'Pocessing Structural Unit Property "' + sup.getFullName() + '" on subcorpus part "' + tmpPartName + '"';
249 321 mdecorde
                        }
250 321 mdecorde
                }
251 321 mdecorde
252 321 mdecorde
253 321 mdecorde
                // Creating the queries parts for each structural units properties values
254 321 mdecorde
                // for (supValue in sup.getOrderedValues()) { // TODO : signaler bug Matthieu, on ne devrait pas être obligé de repasser le sous-corpus à la méthode car sup a déjà été créée depuis le sous-corpus ? getValues() bugge aussi
255 321 mdecorde
                for (supValue in sup.getOrderedValues(corpus)) {
256 321 mdecorde
257 321 mdecorde
                        // TODO : Log
258 321 mdecorde
                        if (DEBUG) println 'Value "' + supValue + '"';
259 321 mdecorde
260 321 mdecorde
                        // Getting the subcorpus linked to the structural unit property value
261 321 mdecorde
                        Subcorpus tmpSubcorpus = corpus.createSubcorpusWithQueryString(su, sup, supValue, "tmp" + UUID.randomUUID());
262 321 mdecorde
263 321 mdecorde
                        // Partition conditions and part name separators
264 321 mdecorde
                        String and = '';
265 321 mdecorde
                        String underscore = '';
266 321 mdecorde
                        if (tmpQuery != '')        {
267 321 mdecorde
                                underscore = '';
268 321 mdecorde
                                and = ' & ';
269 321 mdecorde
                        }
270 321 mdecorde
271 321 mdecorde
                        process(tmpSubcorpus, index + 1, (tmpQuery + and + '_.' + sup.getFullName() + '="' + supValue + '"'), tmpPartName + underscore + supValue);
272 321 mdecorde
273 321 mdecorde
                        // Deleting the temporary subcorpus
274 321 mdecorde
                        // TODO : bug : cette méthode ne supprime pas le corpus sans doute car il faut que le sous-corpus ne contienne pas d'autres sous-corpus ? le delete() en revanche fonctionne.
275 321 mdecorde
                        //                        corpus.dropSubcorpus(tmpSubcorpus);
276 321 mdecorde
                        tmpSubcorpus.delete();
277 321 mdecorde
                }
278 321 mdecorde
        }
279 321 mdecorde
280 321 mdecorde
281 321 mdecorde
        /**
282 321 mdecorde
         *         Autoname the partition.
283 321 mdecorde
         * @param partitionName
284 321 mdecorde
         */
285 321 mdecorde
        protected void autoNamePartition(String partitionName) {
286 321 mdecorde
287 321 mdecorde
                // Structural units names and properties
288 321 mdecorde
                for (int i = 0; i < STRUCTURAL_UNITS.size(); i++) {
289 321 mdecorde
                        partitionName +=  STRUCTURAL_UNITS[i] + '_' + STRUCTURAL_UNITS_PROPERTIES[i] + ' x ';
290 321 mdecorde
                }
291 321 mdecorde
292 321 mdecorde
                // Structural units to ignore
293 321 mdecorde
                for (int i = 0; i < STRUCTURAL_UNITS_TO_IGNORE.size(); i++) {
294 321 mdecorde
                        partitionName +=  'NOT_' + STRUCTURAL_UNITS_TO_IGNORE[i] + '.';
295 321 mdecorde
                }
296 321 mdecorde
297 321 mdecorde
                // Removing last 'x' in partition name
298 321 mdecorde
                PARTITION_NAME = partitionName.substring(0, partitionName.length() - 3);
299 321 mdecorde
        }
300 321 mdecorde
301 321 mdecorde
        /**
302 321 mdecorde
         * Finalize the queries.
303 321 mdecorde
         */
304 321 mdecorde
        protected void finalizeQueries() {
305 321 mdecorde
306 321 mdecorde
                String expandTo = '';
307 321 mdecorde
                // Expanding to user defined target
308 321 mdecorde
                if (EXPAND_TARGET != null && EXPAND_TARGET.length() > 0) {
309 321 mdecorde
                        expandTo = ' expand to ' + EXPAND_TARGET;
310 321 mdecorde
                }
311 321 mdecorde
                // Expanding to last child structural unit in user defined hierarchy
312 321 mdecorde
                else if(STRUCTURAL_UNITS_TO_IGNORE.size() == 0)         {
313 321 mdecorde
                        expandTo = ' expand to ' + STRUCTURAL_UNITS[STRUCTURAL_UNITS.size() - 1];
314 321 mdecorde
                }
315 321 mdecorde
316 321 mdecorde
                // Autonaming the partition
317 321 mdecorde
                if (PARTITION_NAME != null && PARTITION_NAME.length() == 0) {
318 321 mdecorde
                        autoNamePartition(PARTITION_NAME);
319 321 mdecorde
                        // Finalizing partition name
320 321 mdecorde
                        if (EXPAND_TARGET != null && EXPAND_TARGET.length() > 0)
321 321 mdecorde
                                PARTITION_NAME += expandTo.replace(' expand to', '.EXPAND TO').replace(' ', '_');
322 321 mdecorde
                }
323 321 mdecorde
324 321 mdecorde
                // Finalizing queries
325 321 mdecorde
                for (int j = 0; j < queries.size(); j++) {
326 321 mdecorde
327 321 mdecorde
                        String queryEnd = '';
328 321 mdecorde
329 321 mdecorde
                        // Removing some sections
330 321 mdecorde
                        for (sectionToIgnore in STRUCTURAL_UNITS_TO_IGNORE) {
331 321 mdecorde
                                queryEnd += ' & !' + sectionToIgnore;
332 321 mdecorde
                        }
333 321 mdecorde
334 321 mdecorde
                        queryEnd += ']' + expandTo;
335 321 mdecorde
                        queries.set(j, '[' +  queries.get(j) + queryEnd);
336 321 mdecorde
                }
337 321 mdecorde
        }
338 321 mdecorde
}