Statistics
| Revision:

root / tmp / org.txm.analec.rcp / src / org / txm / macro / urs / exploit / CQPUtils.groovy @ 1962

History | View | Annotate | Download (8.3 kB)

1 671 mdecorde
// Copyright © 2017 ENS de Lyon, CNRS, University of Franche-Comté
2 671 mdecorde
// Licensed under the terms of the GNU General Public License (http://www.gnu.org/licenses)
3 671 mdecorde
// @author sheiden
4 671 mdecorde
5 1217 mdecorde
package org.txm.macro.urs.exploit
6 671 mdecorde
7 671 mdecorde
import org.txm.searchengine.cqp.corpus.*
8 671 mdecorde
9 671 mdecorde
def getCorpusByName(name) {
10 671 mdecorde
        def cl = CorpusManager.getCorpusManager().getCorpora()
11 671 mdecorde
        def rc = cl.find {
12 1162 mdecorde
                it.getID() == name
13 671 mdecorde
        }
14 671 mdecorde
15 671 mdecorde
        if (rc) return rc
16 671 mdecorde
17 671 mdecorde
        def rsc = null
18 671 mdecorde
        rc = cl.find { c ->
19 671 mdecorde
                def scl = c.getSubcorpora()
20 671 mdecorde
                def rrsc = scl.find { sc ->
21 1162 mdecorde
                        sc.getID() == name
22 671 mdecorde
                }
23 671 mdecorde
                rsc = rrsc
24 671 mdecorde
        }
25 671 mdecorde
26 671 mdecorde
        return rsc
27 671 mdecorde
}
28 671 mdecorde
29 671 mdecorde
def getCorpora(def script) {
30 671 mdecorde
31 671 mdecorde
        def scriptName = this.class.getSimpleName()
32 671 mdecorde
33 671 mdecorde
        if (script.binding.variables["args"]) {
34 671 mdecorde
                def args = script.binding.variables["args"]
35 671 mdecorde
                if (args["corpus"]) {
36 671 mdecorde
                        return [getCorpusByName(args["corpus"])]
37 671 mdecorde
                } else if (args["corpora"]) {
38 671 mdecorde
                        return args["corpora"].tokenize(',').collect {
39 671 mdecorde
                                return getCorpusByName(it)
40 671 mdecorde
                        }
41 671 mdecorde
                } else {
42 671 mdecorde
                        if (script.corpusViewSelection == null || !(script.corpusViewSelection instanceof Subcorpus || script.corpusViewSelection instanceof MainCorpus)) {
43 671 mdecorde
                                return null
44 671 mdecorde
                        }
45 671 mdecorde
                        return script.corpusViewSelections.findAll { it instanceof Subcorpus || it instanceof MainCorpus }
46 671 mdecorde
                }
47 671 mdecorde
        } else {
48 671 mdecorde
                if (script.corpusViewSelection == null || !(script.corpusViewSelection instanceof Subcorpus || script.corpusViewSelection instanceof MainCorpus)) {
49 671 mdecorde
                        return null
50 671 mdecorde
                }
51 671 mdecorde
                return script.corpusViewSelections.findAll { it instanceof Subcorpus || it instanceof MainCorpus }
52 671 mdecorde
        }
53 671 mdecorde
54 671 mdecorde
}
55 671 mdecorde
56 671 mdecorde
def newTestSubCorpusName(name) {
57 671 mdecorde
        def cl = CorpusManager.getCorpusManager().getCorpora()
58 671 mdecorde
        def rc = cl.find {
59 671 mdecorde
                it.getName() == name
60 671 mdecorde
        }
61 671 mdecorde
62 671 mdecorde
        if (!rc) {
63 671 mdecorde
                println "** corpus '"+name+"' not found."
64 671 mdecorde
                return null
65 671 mdecorde
        }
66 671 mdecorde
67 671 mdecorde
        def scl = rc.getSubcorpora()
68 671 mdecorde
        def n = 1
69 671 mdecorde
        def loop = true
70 671 mdecorde
        while (loop) {
71 671 mdecorde
                def rsc = scl.find { sc ->
72 671 mdecorde
                        sc.getName() == "CORPUS"+n
73 671 mdecorde
                }
74 671 mdecorde
                if (rsc) n++ else loop = false
75 671 mdecorde
        }
76 671 mdecorde
77 671 mdecorde
        return "CORPUS"+n
78 671 mdecorde
}
79 671 mdecorde
80 671 mdecorde
def positions2cql(matches) {
81 671 mdecorde
        // [0],[1],[2-3],[4-5],[6]
82 671 mdecorde
        // 0,1,2-3,4-5,6
83 671 mdecorde
        // "(n1:[])|(n2:[] []{1}) :: (n1 = 0)|(n1 = 1)|(n1 = 6)|(n2 = 2)|(n2 = 4)"
84 671 mdecorde
85 671 mdecorde
        def singletons = []
86 671 mdecorde
        def intervals = [:]
87 671 mdecorde
        matches.tokenize(',').each { interval ->
88 671 mdecorde
                if (interval.indexOf('-') != -1) { // start-end
89 671 mdecorde
                        (start, end) = interval.tokenize('-') as int[]
90 671 mdecorde
                        l = end-start
91 671 mdecorde
                        if (intervals[l]) {
92 671 mdecorde
                                intervals.put(l, intervals[l] << start)
93 671 mdecorde
                        } else {
94 671 mdecorde
                                intervals.put(l, [start])
95 671 mdecorde
                        }
96 671 mdecorde
                } else { // singleton
97 671 mdecorde
                        singletons << interval.toInteger()
98 671 mdecorde
                }
99 671 mdecorde
        }
100 671 mdecorde
101 671 mdecorde
        def singletonPositions = ""
102 671 mdecorde
        def intervalsCQLs = ""
103 671 mdecorde
        def intervalsPositions = ""
104 671 mdecorde
105 671 mdecorde
        // "(n1:[])|(n2:[] []{1}) :: (n1 = 0)|(n1 = 1)|(n1 = 6)|(n2 = 2)|(n2 = 4)"
106 671 mdecorde
107 671 mdecorde
        def firstSingleton = true
108 671 mdecorde
        singletons.each {
109 671 mdecorde
                if (!firstSingleton) singletonPositions += "|"
110 671 mdecorde
                firstSingleton = false
111 671 mdecorde
                singletonPositions += "n1="+it+""
112 671 mdecorde
        }
113 671 mdecorde
114 671 mdecorde
        def firstInterval = true
115 671 mdecorde
        intervals.each { length, positions ->
116 671 mdecorde
                if (!firstInterval) intervalsCQLs += "|"
117 671 mdecorde
                if (!firstInterval) intervalsPositions += "|"
118 671 mdecorde
                firstInterval = false
119 671 mdecorde
                intervalsCQLs += "n"+(length+1)+":[][]{"+length+"}"
120 671 mdecorde
                def firstPosition = true
121 671 mdecorde
                positions.each {
122 671 mdecorde
                        if (!firstPosition) intervalsPositions += "|"
123 671 mdecorde
                        firstPosition = false
124 671 mdecorde
                        intervalsPositions += "n"+(length+1)+"="+it
125 671 mdecorde
                }
126 671 mdecorde
        }
127 671 mdecorde
128 671 mdecorde
        def q = ""
129 671 mdecorde
        if (singletons.size() > 0) {
130 671 mdecorde
                q += "n1:[]"
131 671 mdecorde
        }
132 671 mdecorde
        if (singletons.size() > 0 && intervals.size() > 0) {
133 671 mdecorde
                q += "|"
134 671 mdecorde
        }
135 671 mdecorde
        if (intervals.size() > 0) {
136 671 mdecorde
                q += intervalsCQLs
137 671 mdecorde
        }
138 671 mdecorde
        q += "::"
139 671 mdecorde
        if (singletons.size() > 0) {
140 671 mdecorde
                q += singletonPositions
141 671 mdecorde
        }
142 671 mdecorde
        if (singletons.size() > 0 && intervals.size() > 0) {
143 671 mdecorde
                q += "|"
144 671 mdecorde
        }
145 671 mdecorde
        if (intervals.size() > 0) {
146 671 mdecorde
                q += intervalsPositions
147 671 mdecorde
        }
148 671 mdecorde
149 671 mdecorde
        return q
150 671 mdecorde
151 671 mdecorde
}
152 671 mdecorde
153 671 mdecorde
def corpus2positions(def corpus, def maxMatches, def pretty = false) {
154 671 mdecorde
155 671 mdecorde
        def res = ""
156 671 mdecorde
        def matches = corpus.getMatches()
157 671 mdecorde
158 671 mdecorde
        if (matches.size() == 0) {
159 671 mdecorde
                return "<empty>"
160 671 mdecorde
        } else {
161 671 mdecorde
                def first = 1
162 671 mdecorde
                matches.take(maxMatches).each {
163 671 mdecorde
                        if (first) { first = 0 } else {
164 671 mdecorde
                                if (pretty) {
165 671 mdecorde
                                        res += ", "
166 671 mdecorde
                                } else {
167 671 mdecorde
                                        res += ","
168 671 mdecorde
                                }
169 671 mdecorde
                        }
170 671 mdecorde
                        // res += "["
171 671 mdecorde
                        if (it.getStart() < it.getEnd()) {
172 671 mdecorde
                                res += it.getStart()+"-"+it.getEnd()
173 671 mdecorde
                        } else {
174 671 mdecorde
                                res += it.getStart()
175 671 mdecorde
                        }
176 671 mdecorde
                        // res += "]"
177 671 mdecorde
                }
178 671 mdecorde
        }
179 671 mdecorde
180 671 mdecorde
        if (matches.size() > maxMatches) {
181 671 mdecorde
                res += "..."
182 671 mdecorde
        }
183 671 mdecorde
184 671 mdecorde
        return res
185 671 mdecorde
}
186 671 mdecorde
187 671 mdecorde
methods = this.getClass().declaredMethods.findAll { !it.synthetic }.name.sort().unique()
188 671 mdecorde
methods.removeAll(['main', 'run'])
189 671 mdecorde
println "** CQPUtils is not meant to be called directly.\nPlease import its methods ${methods}\nwith the following declaration:\nimport org.txm.macro.cqp.CQPUtilsMacro"
190 671 mdecorde
191 671 mdecorde
/*
192 671 mdecorde
      ___           ___           ___           ___           ___           ___
193 671 mdecorde
     /\  \         /\__\         /\__\         /\  \         |\__\         /\  \
194 671 mdecorde
    /::\  \       /::|  |       /::|  |       /::\  \        |:|  |       /::\  \
195 671 mdecorde
   /:/\:\  \     /:|:|  |      /:|:|  |      /:/\:\  \       |:|  |      /:/\:\  \
196 671 mdecorde
  /::\~\:\  \   /:/|:|  |__   /:/|:|  |__   /::\~\:\  \      |:|__|__   /::\~\:\  \
197 671 mdecorde
 /:/\:\ \:\__\ /:/ |:| /\__\ /:/ |:| /\__\ /:/\:\ \:\__\ ____/::::\__\ /:/\:\ \:\__\
198 671 mdecorde
 \/__\:\/:/  / \/__|:|/:/  / \/__|:|/:/  / \:\~\:\ \/__/ \::::/~~/~    \:\~\:\ \/__/
199 671 mdecorde
      \::/  /      |:/:/  /      |:/:/  /   \:\ \:\__\    ~~|:|~~|      \:\ \:\__\
200 671 mdecorde
      /:/  /       |::/  /       |::/  /     \:\ \/__/      |:|  |       \:\ \/__/
201 671 mdecorde
     /:/  /        /:/  /        /:/  /       \:\__\        |:|  |        \:\__\
202 671 mdecorde
     \/__/         \/__/         \/__/         \/__/         \|__|         \/__/
203 671 mdecorde

204 671 mdecorde

205 671 mdecorde

206 671 mdecorde
0 1 2 3 4 5 6 7 8 9
207 671 mdecorde

208 671 mdecorde
+ + + +
209 671 mdecorde
0 1 2 3 4 5 6 7 8 9
210 671 mdecorde
+0,+1,+2,+3
211 671 mdecorde
n:[] :: n = 0|n = 1|n = 2|n = 3
212 671 mdecorde

213 671 mdecorde
[ ] [ ]
214 671 mdecorde
0 1 2 3 4 5 6 7 8 9
215 671 mdecorde
0-1,2-3
216 671 mdecorde
n:[] []{1} :: n = 0
217 671 mdecorde
n:[] []{1} :: n = 2
218 671 mdecorde

219 671 mdecorde
[   ] +
220 671 mdecorde
0 1 2 3 4 5 6 7 8 9
221 671 mdecorde
0-2,+3
222 671 mdecorde
n:[] []{2} :: n = 0
223 671 mdecorde
n:[] :: n = 3
224 671 mdecorde

225 671 mdecorde

226 671 mdecorde
 */
227 671 mdecorde
228 671 mdecorde
/*
229 671 mdecorde

230 671 mdecorde
Touching intervals mergers
231 671 mdecorde
==========================
232 671 mdecorde

233 671 mdecorde
A) from http://stackoverflow.com/questions/31670849/merge-overlapping-intervals
234 671 mdecorde

235 671 mdecorde
import java.util.*;
236 671 mdecorde

237 671 mdecorde
public class Ideone
238 671 mdecorde
{
239 671 mdecorde
    public static void main (String[] args) throws java.lang.Exception
240 671 mdecorde
    {
241 671 mdecorde
        ArrayList<Interval> x = new ArrayList<>();
242 671 mdecorde

243 671 mdecorde
        x.add(new Interval(1, 3));
244 671 mdecorde
        x.add(new Interval(2, 6));
245 671 mdecorde
        x.add(new Interval(8, 10));
246 671 mdecorde
        x.add(new Interval(15, 18));
247 671 mdecorde
        x.add(new Interval(17, 20));
248 671 mdecorde

249 671 mdecorde
        x = merge(x);
250 671 mdecorde

251 671 mdecorde
        for(Interval i : x)
252 671 mdecorde
        {
253 671 mdecorde
            System.out.println(i.getStart() + " " + i.getEnd());
254 671 mdecorde
        }
255 671 mdecorde
    }
256 671 mdecorde

257 671 mdecorde
    public static ArrayList<Interval> merge(ArrayList<Interval> intervals) {
258 671 mdecorde

259 671 mdecorde
        if(intervals.size() == 0 || intervals.size() == 1)
260 671 mdecorde
            return intervals;
261 671 mdecorde

262 671 mdecorde
        Collections.sort(intervals, new IntervalComparator());
263 671 mdecorde

264 671 mdecorde
        Interval first = intervals.get(0);
265 671 mdecorde
        int start = first.getStart();
266 671 mdecorde
        int end = first.getEnd();
267 671 mdecorde

268 671 mdecorde
        ArrayList<Interval> result = new ArrayList<Interval>();
269 671 mdecorde

270 671 mdecorde
        for (int i = 1; i < intervals.size(); i++) {
271 671 mdecorde
            Interval current = intervals.get(i);
272 671 mdecorde
            if (current.getStart() <= end) {
273 671 mdecorde
                end = Math.max(current.getEnd(), end);
274 671 mdecorde
            } else {
275 671 mdecorde
                result.add(new Interval(start, end));
276 671 mdecorde
                start = current.getStart();
277 671 mdecorde
                end = current.getEnd();
278 671 mdecorde
            }
279 671 mdecorde
        }
280 671 mdecorde

281 671 mdecorde
        result.add(new Interval(start, end));
282 671 mdecorde
        return result;
283 671 mdecorde
    }
284 671 mdecorde
}
285 671 mdecorde

286 671 mdecorde
class Interval
287 671 mdecorde
{
288 671 mdecorde
    private int start;
289 671 mdecorde
    private int end;
290 671 mdecorde

291 671 mdecorde
    Interval() {
292 671 mdecorde
        start = 0;
293 671 mdecorde
        end = 0;
294 671 mdecorde
    }
295 671 mdecorde

296 671 mdecorde
    Interval(int s, int e)
297 671 mdecorde
    {
298 671 mdecorde
        start = s;
299 671 mdecorde
        end = e;
300 671 mdecorde
    }
301 671 mdecorde

302 671 mdecorde
    public int getStart() {
303 671 mdecorde
        return start;
304 671 mdecorde
    }
305 671 mdecorde

306 671 mdecorde
    public int getEnd() {
307 671 mdecorde
        return end;
308 671 mdecorde
    }
309 671 mdecorde
}
310 671 mdecorde

311 671 mdecorde
class IntervalComparator implements Comparator<Interval>
312 671 mdecorde
{
313 671 mdecorde
    public int compare(Interval i1, Interval i2)
314 671 mdecorde
    {
315 671 mdecorde
        return i1.getStart() - i2.getStart();
316 671 mdecorde
    }
317 671 mdecorde
}
318 671 mdecorde

319 671 mdecorde
B) from http://www.programcreek.com/2012/12/leetcode-merge-intervals/
320 671 mdecorde

321 671 mdecorde
public List<Interval> merge(List<Interval> intervals) {
322 671 mdecorde
    List<Interval> result = new ArrayList<Interval>();
323 671 mdecorde

324 671 mdecorde
    if(intervals==null||intervals.size()==0)
325 671 mdecorde
        return result;
326 671 mdecorde

327 671 mdecorde
    Collections.sort(intervals, new Comparator<Interval>(){
328 671 mdecorde
        public int compare(Interval i1, Interval i2){
329 671 mdecorde
            if(i1.start!=i2.start)
330 671 mdecorde
                return i1.start-i2.start;
331 671 mdecorde
            else
332 671 mdecorde
                return i1.end-i2.end;
333 671 mdecorde
        }
334 671 mdecorde
    });
335 671 mdecorde

336 671 mdecorde
    Interval pre = intervals.get(0);
337 671 mdecorde
    for(int i=0; i<intervals.size(); i++){
338 671 mdecorde
        Interval curr = intervals.get(i);
339 671 mdecorde
        if(curr.start>pre.end){
340 671 mdecorde
            result.add(pre);
341 671 mdecorde
            pre = curr;
342 671 mdecorde
        }else{
343 671 mdecorde
            Interval merged = new Interval(pre.start, Math.max(pre.end, curr.end));
344 671 mdecorde
            pre = merged;
345 671 mdecorde
        }
346 671 mdecorde
    }
347 671 mdecorde
    result.add(pre);
348 671 mdecorde

349 671 mdecorde
    return result;
350 671 mdecorde
}
351 671 mdecorde
 */