public function analyze()
{
$this->query(<<<GREMLIN
def distance(String str1, String str2) {
def str1_len = str1.length()
def str2_len = str2.length()
int[][] distance = new int[str1_len + 1][str2_len + 1]
(str1_len + 1).times { distance[it][0] = it }
(str2_len + 1).times { distance[0][it] = it }
(1..str1_len).each { i ->
(1..str2_len).each { j ->
distance[i][j] = [distance[i-1][j]+1, distance[i][j-1]+1, str1[i-1]==str2[j-1]?distance[i-1][j-1]:distance[i-1][j-1]+1].min()
}
}
distance[str1_len][str2_len]
}
GREMLIN
);
$this->atomIs('Function')->raw('where( __.sideEffect{ variables = []}.out("BLOCK").repeat( out() ).emit( hasLabel("Variable")).times(' . self::MAX_LOOPING . ').filter{ it.get().value("code").length() > 3}.sideEffect{ variables.push(it.get().value("code")); }.fold() )')->raw('sideEffect{
variables = variables.unique().sort();
found = [];
variables.each{ i ->
if (variables.findAll{ it != i && ( it != i + "s" && it + "s" != i) && distance( it , i) < 2 }.size() > 0) {
found.add(i);
}
}
}')->atomInside('Variable')->raw('filter{ it.get().value("code") in found}');
$this->prepareQuery();
}