Проблема с OQL 'уникальной' функцией 'jhat' в Java 1.6.0_24 - PullRequest
1 голос
/ 16 мая 2011

это мой первый опубликованный вопрос. У меня довольно сложный OQL-запрос, в котором перечислены статические поля классов, загруженных в наши пакеты. Одна из проблем, с которыми я сталкиваюсь при выполнении запроса к jhat из Java 1.6.0_24, заключается в том, что «уникальная» функция не работает должным образом. Я ожидаю

select unique(['a', 'b', 'c', 'a'])

чтобы вернуть ['a', 'b', 'c'], но вместо этого он возвращает ['a'], wtf?

Если кого-то интересует фактический полный запрос (замените com.mydomain на то, что вам нравится):

select cl.name + ' -- ' + unique(map(filter(referees(cl), "classof(it).name != 'java.lang.Class' && classof(it).name != 'java.lang.String' && classof(it).name != 'sun.misc.Launcher$AppClassLoader' && classof(it).name != 'java.security.ProtectionDomain' && classof(it).name != '[Ljava.security.cert.Certificate;' && classof(it).name != 'sun.plugin2.applet.JNLP2ClassLoader'"), "classof(it).name")).join(', ')
from instanceof java.lang.Class cl
where /com.mydomain./(cl.name) && ! /com.mydomain.xs.protobuf./(cl.name)
&& length(filter(referees(cl), "classof(it).name != 'java.lang.Class' && classof(it).name != 'java.lang.String' && classof(it).name != 'sun.misc.Launcher$AppClassLoader' && classof(it).name != 'java.security.ProtectionDomain'")) > 0;

1 Ответ

1 голос
/ 17 мая 2011

По умолчанию unique уникально для objectid объекта, который подходит для фактически отслеживаемых объектов, но для строк возвращает нуль. Таким образом, сохраняется только последняя строка (поскольку все строки имеют неуникальные значения objectid).

У вас есть два варианта:

  1. Uniquify на отслеживаемых объектах, а не их именах:

    map(unique(filter(map(referees(cl), classof), "it.name != ...")), "it.name")
    
  2. Укажите «функцию» для унификации, чтобы она работала со строками:

    unique(['a', 'b', 'c', 'a'], 'it')
    

    Это приведет к унификации самих струн.

...