Fatwire Content Server. Conocer el número de elementos retornados con AssetDataManager antes de iterar sobre ellos
Esta mañana mantenía una conversación con un querido amigo de un anterior trabajo y me planteaba una duda muy interesante.
No sabía como obtener el número de elementos de una query que se ejecutaba con AssetDataManager antes de iterar sobre los datos devueltos. La cuestión era interesante porque yo tampoco lo sabía (aunque dije que sí se podía antes de cerciorarme, esta vez hubo suerte).
Lo primero que hice fue buscar en los manuales un ejemplo de ese tipo de querys con AssetDataManager, ya que en la aplicación en la que estoy actualmente no hay código parecido. Una vez localizado, ejecuté un Kit de Desarrollo personal para pasar del dicho al hecho y hacer las pruebas pertinentes.
El código sería algo parecido a esto
Session ses = SessionFactory.getSession();
AssetDataManager mgr =AssetDataManager) ses.getManager( AssetDataManager.class.getName() );
Query q = new SimpleQuery(“TIPO_CONTENIDO”, SUBTIPO_CONTENIDO”, null, Collections.singletonList(“ATRIBUTO”) );
Y luego el for (aquí deberíamos conocer el número de elementos devueltos por AssetDataManager, antes del for)
for( AssetData data : mgr.read( q ) )
Mirando en la documentación, compruebo que la sentencia mgr.read(q) devuelve un objeto de tipo AssetData y que este implementa la interfaz Iterable. De ahí la sintaxis del for, un poco alejada de la clásica (¿me estaré volviendo clásico/viejo?) for(inicialización; comprobación de la condición;cambio de valor de la variable que forma la condición), que se aprovecha de la interfaz Iterable para recorrer hasta el final el objeto devuelto.
Entonces vamos a recuperar el susodicho objeto
Iterable <AssetData> aData = mgr.read( q );
Ok. Ahora quiero conocer su tamaño (size()). Sin embargo ni la clase AssetData ni el interfaz Iterable implementan dicho método. He de intentar tener un objeto que lo tenga.
Mirando la api de java compruebo que el interfaz Iterable tiene un conjunto de SubInterfaces entre los que se encuentra Collection. Ese interfaz estoy más acostumbrado a usarlo.
De nuevo voy a mirar el API de java, en este caso a ver que pista me puede dar Collection. Veo que el objeto Vector implementa el interfaz Collection, que a su vez es un SubInterfaz de Iterable..Bingo. Al mirar el API de Vector para comprobar de que manera se relaciona Vector con Collection veo que uno de los constructores de Vector tiene como parámetro un objeto que implemente Collection…Esto está hecho entonces.
El código que me falta es el siguiente:
Vector vcData = new Vector((Collection)aData);
Hecho, ya se puede averiguar el número de elementos.
vcData.size();
Por tanto finalmente el código quedaría de la siguiente manera:
Session ses = SessionFactory.getSession();
AssetDataManager mgr =AssetDataManager) ses.getManager( AssetDataManager.class.getName() );
Query q = new SimpleQuery(“TIPO_CONTENIDO”, SUBTIPO_CONTENIDO”, null, Collections.singletonList(“ATRIBUTO”) );
Iterable <AssetData> aData = mgr.read( q );
Vector vcData = new Vector((Collection)aData);
out.println(“elementos= ” + vcData.size());
//Y ya vendría el for
for( AssetData data : mgr.read( q ) )
No se si habrá otra manera de hacerlo, si es así estaría muy interesado en saberla.
El conocimiento es colectivo. Saludos