2011-05-16 60 views
1

這是我第一次發佈的問題。我有一個相當複雜的OQL查詢,它列出了我們包中加載的類的靜態字段。我在查看Java 1.6.0_24的'jhat'時看到的一個問題是'unique'函數無法按預期工作。我期望Java中'jhat'的OQL'獨特'功能麻煩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; 
+0

這似乎是返回最後一個元素爲: 「選擇唯一的([ 'A', 'B', 'A', 'Q'])」 返回[ 'Q'] – karmakaze 2011-05-16 19:21:19

回答

1

默認情況下,unique uniquifies在對象的objectid,這是適合實際追蹤的對象,但對於字符串,它返回null。因此,只保留最後一個字符串(因爲所有字符串都有非唯一的objectid值)。

你有兩個選擇:

  1. Uniquify的跟蹤對象,而不是他們的名字:

    map(unique(filter(map(referees(cl), classof), "it.name != ...")), "it.name") 
    
  2. 指定的 「功能」,具有uniquify,所以它適用於字符串:

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

    這將導致字符串本身被單獨化。

+0

謝謝!我正在考慮(2),但並沒有完全明白:「獨特的(map(['a','b','c','q'],'it'))」現在使感。 – karmakaze 2011-05-16 21:50:39