Problema con la función 'única' de OQL de 'jhat' en Java 1.6.0_24

esta es mi primera pregunta publicada. Tengo una consulta OQL bastante complicada que enumera campos estáticos de clases cargadas en nuestros paquetes. Un problema que veo al ejecutar la consulta contra 'jhat' de Java 1.6.0_24 es que la función 'única' no funciona como se esperaba. Espero

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

para devolver ['a', 'b', 'c'] pero en su lugar devuelve ['a'], wtf?

Si alguien está interesado, la consulta completa real es (reemplace 'com.mydomain' con lo que desee):

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;

preguntado el 16 de mayo de 11 a las 18:05

Parece estar devolviendo el último elemento como: "seleccionar único (['a', 'b', 'a', 'q'])" devuelve ['q'] -

1 Respuestas

De forma predeterminada, unique uniquifica en el objeto objectid, que es adecuado para objetos con seguimiento reales, pero para cadenas devuelve nulo. Por lo tanto, solo se conserva la última cadena (ya que todas las cadenas tienen objectid valores).

Usted tiene dos opciones:

  1. Uniquify en los objetos trazados, en lugar de sus nombres:

    map(unique(filter(map(referees(cl), classof), "it.name != ...")), "it.name")
    
  2. Especifique la "función" con la que uniquificar, de modo que funcione para cadenas:

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

    Esto hará que las cuerdas en sí mismas no se mezclen.

contestado el 17 de mayo de 11 a las 00:05

¡Gracias! Estaba pensando en la línea de (2) pero no lo entendí del todo: "único (mapa (['a', 'b', 'c', 'q'], 'it'))" que ahora hace sentido. - karmakaze

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.