Filtros de Búsqueda
Además de especificar una búsqueda usando un grupo de atributos, podemos
especificarla en la forma de un filtro
de búsqueda. Un filtro de búsqueda es una consulta expresada en la
forma de una expresión lógica. La síntaxis de todos los filtros aceptados por
DirContext.search()
se describe en la RFC 2254.
El siguiente filtro de búsqueda especifica que las entradas cualificadas
deben tener un atributo "sn" con un valor de "Geisel"
y un atributo "mail" con cualquier valor.
(&(sn=Geisel)(mail=*))
El siguiente código crea un filtro y los controles
de búsqueda por defecto SearchControls,
y los usa para realizar la búsqueda. La búsqueda es equivalente a la
presentada en el ejemplo de la página anterior.
// Create the default search controls
SearchControls ctls = new SearchControls();
// Specify the search filter to match
// Ask for objects that have the attribute "sn" == "Giesel"
// and the "mail" attribute
String filter = "(&(sn=Geisel)(mail=*))";
// Search for objects using the filter
NamingEnumeration answer = ctx.search("ou=People", filter, ctls);
Ejecutar este ejemplo produce esta
salida.
# java SearchWithFilterRetAll
>>>cn=Ted Geisel
attribute: sn
value: Geisel
attribute: objectclass
value: top
value: person
value: organizationalPerson
value: inetOrgPerson
attribute: jpegphoto
value: [B@1dacd75e
attribute: mail
value: Ted.Geisel@JNDITutorial.com
attribute: facsimiletelephonenumber
value: +1 408 555 2329
attribute: cn
value: Ted Geisel
attribute: telephonenumber
value: +1 408 555 5252
Rápida Visión de la Síntaxis de los Filtros de Búsqueda
La síntaxis del filtro de búsqueda es básicamente una expresión lógica en
notación de prefijo, (es decir, los operadores lógicos aparecen antes de los
argumentos). La siguiente tabla lista los símbolos usados para crear filtros.
| Símbolo |
Descripción |
| & |
conjunción (es decir, and -- todos los de la lista deben ser ciertos) |
| | |
disjunción (es decir, or --una o más alternativas deben ser ciertas) |
| ! |
negación (es decir, not -- el ítem que está siendo negado no debe ser cierto) |
| = |
igualdad (de acuerdo a la regla de correspondencia del atributo) |
| ~= |
aproximadamente igual (de acuerdo a la regla de correspondencia del atributo) |
| >= |
mayor que (de acuerdo a la regla de correspondencia del atributo) |
| <= |
menor que (de acuerdo a la regla de correspondencia del atributo) |
| =* |
presencia (es decir, la entrada debe tener el atributo, pero su valor es irrelevante) |
| * |
comodín (indica cero o más caracteres que pueden ocurrir en esa
posición), se utiliza cuando se especifican atributos para su correspondencia |
| \ |
escape (para escapar '*', '(', or ')' cuando ocurren dentro del valor del un atributo) |
Cada ítem del filtro está compuesto usando un identificador de atributo y
un valor de atributo o símbolos que denotan el valor del atributo. Por ejemplo,
el ítem "sn=Geisel" significa que el atributo "sn"
debe tener el valor de atributo "Geisel" y el ítem "mail=*"
indica que el aributo "mail" sólo debe estar presente.
Cada ítem debe estar encerrado entre paréntesis, como en "(sn=Geisel)".
Estos ítems se componen usando operadores lógicos como "&"
(conjunción) para crear operaciones lógicas, como en "(&
(sn=Geisel) (mail=*))".
Cada expresión lógica puede estar compuesta por otros ítems que a su vez
pueden ser otras expresiones lógicas, como en "(| (&
(sn=Geisel) (mail=*)) (sn=L*))". Este último ejemplo solicita las
entradas que tiene el atributo "sn" de "Geisel"
y el atributo "mail" o cuya entrada "sn"
empieza con la letra "L."
Para una completa descripción de la síntaxis puedes ver la RFC
2254.
Devolver los Atributos Seleccionados
El ejemplo anterior devolvía todos los atributos asociados con las entradas que
cumplían con el filtro especificado. Podemos seleccionar los atributos a
devolver seleccionando los argumentos de control de búsqueda. Podemos crear un
array de identificadores de atributos que queremos incluir en el resultado y
pasarlo a SearchControls.setReturningAttributes().
(Los controles de búsqueda se describen en la siguiente
sección.) Aquí tenemos un ejemplo.
// Specify the ids of the attributes to return
String[] attrIDs = {"sn", "telephonenumber", "golfhandicap", "mail"};
SearchControls ctls = new SearchControls();
ctls.setReturningAttributes(attrIDs);
Este ejemplo es equivalente al ejemplo Devolver
Atributos Seleccionados de la página anterior. Al ejecutar el ejemplo
se produce la siguiente salida. (La entrada no tiene un atributo "golfhandicap",
por eso no se devuelve).
# java SearchWithFilter
>>>cn=Ted Geisel
attribute: sn
value: Geisel
attribute: mail
value: Ted.Geisel@JNDITutorial.com
attribute: telephonenumber
value: +1 408 555 5252