[Gvsig_desarrolladores] Consulta SQL anidada a tabla alphanumérica de SHP

Alberto Calzada albertocalsa en gmail.com
Mar Ago 7 13:42:02 CEST 2012


Hola Fran,

De acuerdo, no problem. Ya me lo olía después de echar un ojo más despacio
a la librería, era solo por si acaso en alguna versión nueva esto se había
actualizado y podía importarlo más que nada.
Perderemos un poco en eficiencia pero no hay nada que no pueda resolver un
bucle "for". ;-)

Muchas gracias por tu pronta respuesta y atención,

Un saludo,

Alberto



2012/8/7 Francisco José Peñarrubia <fpenarru en gmail.com>

> Hola Alberto.
>
> El SQL que entiende la librería libGDBMS es muy limitado (la versión que
> usamos en gvSIG es bastante vieja).
>
> Si quieres hacer cosas de ese estilo, creo que lo mejor es que recorras el
> recordset y hagas las operaciones por código.
>
> Sorry.
>
> Saludos.
>
> Fran.
>
> El 7 de agosto de 2012 13:19, Alberto Calzada <albertocalsa en gmail.com>escribió:
>
>> Hola de nuevo a todos,
>>
>> He simplificado la consulta del anterior e-mail a algo asi como:
>>
>> select min(abs( ATT1 - myVariable1 + ATT2 - myVariable2 + ... + ATTN -
>> myVariableN)) from myTable;
>>
>> Pero me he encontrado con el siguiente error en tiempo de ejecución:
>>
>> java.lang.NullPointerException
>>         at
>> com.hardcode.gdbms.engine.function.FunctionManager.getFunction(Funct
>> onManager.java:46)
>>         at
>> com.hardcode.gdbms.engine.instruction.FunctionAdapter.isAggregated(F
>> nctionAdapter.java:36)
>>         at
>> com.hardcode.gdbms.engine.instruction.UnaryExprAdapter.isAggregated(
>> naryExprAdapter.java:109)
>>         at
>> com.hardcode.gdbms.engine.instruction.ProductExprAdapter.isAggregate
>> (ProductExprAdapter.java:128)
>>         at
>> com.hardcode.gdbms.engine.strategies.FirstStrategy.select(FirstStrat
>> gy.java:53)
>>         at
>> com.hardcode.gdbms.engine.data.DataSourceFactory.getDataSource(DataS
>> urceFactory.java:1342)
>>         at
>> com.hardcode.gdbms.engine.data.DataSourceFactory.executeSQL(DataSour
>> eFactory.java:1622)
>>         at
>> model.spatial.GISOutputExporterVectorLayer.addData(GISOutputExporter
>> ectorLayer.java:226)
>>         at
>> model.core.Execution.executeRimerCrossValidation(Execution.java:223)
>>         at model.core.Execution.access$2(Execution.java:210)
>>         at model.core.Execution$ActualTask.<init>(Execution.java:256)
>>         at model.core.Execution$2.construct(Execution.java:96)
>>         at model.threadExec.SwingWorker$2.run(SwingWorker.java:60)
>>         at java.lang.Thread.run(Unknown Source)
>>
>> He echado un vistazo a los ficheros fuente, especialmente a esos que
>> implementan la interfaz "function" de la libGDBMS y he visto que no está
>> implementadas las funciones Min, Abs o Max. Estoy desarrollando mi
>> extensión sobre la versión estable gvSIG 1.11. ¿Sabeis si estas funciones
>> SQL están implementadas en alguna otra librería/extensión o en alguna
>> versión más reciente de gvSIG? Si ese es el caso, podría importarlas a la
>> libGDBMS para trabajar con ellas?
>>
>> Muchas gracias de antemano,
>>
>> Un saludo,
>>
>> Alberto
>>
>>
>>
>> 2012/8/7 Alberto Calzada <albertocalsa en gmail.com>
>>
>>> Hola a todos de nuevo,
>>>
>>> Estoy desarrollando una extensión para gvSIG y me he vuelto a encasillar
>>> en un problemilla que no sé si os habrá sucedido ya a alguno. Estoy
>>> intentando crear una consulta SQL para que me devuelva una sola fila (la
>>> que busco para añadir los resultados de la ejecución de mi extensión).
>>>
>>> El caso es que tengo un problema de precisión de los datos (que tanto de
>>> entrada como de salida pueden tener cualquier valor y cualquier formato).
>>> Por ese motivo no puedo crear la consulta de forma sencilla con valores
>>> exactos tal que así:
>>>
>>> select * from myTable where area = "myVariableArea" and perimeter =
>>> "myVariablePerimeter" and etc etc
>>>
>>> Lo de area y perimeter es un ejemplo. Yo puedo tener cualquier otro tipo
>>> de dato entero o decimal, con cualquier número de decimales...
>>>
>>> Por lo tanto, he decidido atacar el problema buscando "la fila más
>>> parecida a la que busco". Por lo tanto estoy tratando de definir una
>>> consulta de esta forma:
>>>
>>> select * from myTable as t1 where ( select min(abs( t1.PERIMETER -
>>> "myVariablePerimeter" + t1.AREA - "myVariableArea" + etc...
>>>
>>> Mando este e-mail a las dos listas porque he probado a definir este tipo
>>> de consultas primero con la interfaz gráfica de gvSIG, con la herramienta
>>> "Filtro" de la tabla, pero me salta uno de esos bugs de cuando la consulta
>>> no está bien definida. (Que podría ser eso porque llevo bastantes años sin
>>> tocar SQL...). Si alguno sabe más del tema y ve algún fallo en mi consulta
>>> estaría agradecido si me lo pudiera aclarar.
>>>
>>> Y también lo mando a la de desarrolladores porque no tengo claro que
>>> pueda definir consultas SQL anidadas sobre mi layer.getRecordset() y quizás
>>> alguno de los desarrolladores supiera algo al respecto.
>>>
>>> El código fuente que utilizo es algo así:
>>>
>>> String sqlQuery = "select * from '"+lyr.getRecordset().getName()+"' ";
>>>  sqlQuery += "where "+
>>> this.generateQueryFromSample(dsl.getInputCombination(i),
>>> lyr.getRecordset().getName());
>>> System.out.println(sqlQuery);
>>>  lyr.setActive(true);
>>> DataSource ds =
>>> lyr.getRecordset().getDataSourceFactory().executeSQL(sqlQuery,
>>> DataSourceFactory.AUTOMATIC_OPENING);
>>>  ds.start();
>>>
>>> ShpSchemaManager schemaManager = new
>>> ShpSchemaManager(docFile.getAbsolutePath());
>>>  schemaManager.createSchema(outputLyrDef);
>>>  IFeatureIterator it = lyr.getSource().getFeatureIterator(sqlQuery,
>>> lyr.getProjection());
>>>
>>> for(int counter = 0; counter < ds.getRowCount() && it.hasNext();
>>> counter++){
>>>  IFeature geom = (IFeature) it.next();
>>> LinkedList<Value> values = new LinkedList<Value>();
>>>
>>> //Adding antecedents
>>> Value v[] = lyr.getRecordset().getRow(counter).clone();
>>>  for(int j=0; j< fieldsExported.size(); j++){
>>> values.add(v[fieldsExported.get(j)]);
>>>  }
>>> //AddingConsequent
>>> values.add(v[consequentField]);
>>>  values.add(ValueFactory.createValueByType("20.2", Types.DOUBLE, 8, 4));
>>> geom.setAttributes(values.toArray(new Value[0]));
>>>  DefaultRowEdited edRow = new DefaultRowEdited(geom,
>>> DefaultRowEdited.STATUS_ADDED, counter);
>>>  edRow.setAttributes(values.toArray(new Value[0]));
>>> writeSHP.process(edRow);
>>>  }
>>> writeSHP.postProcess();
>>>
>>> Donde la función "generateQueryFromSample" es la siguiente (para formar
>>> la subconsulta anidada):
>>>
>>> private String generateQueryFromSample(Sample s, String tableName){
>>>  String query = " ( select min(abs( ";
>>> for(int i=0;i<dsl.getHeaderTreeNodes().size();i++){
>>>
>>> if(dsl.getHeaderTreeNodes().get(i).getReferentialSetOfValues().isSpatial()){
>>> Input input = s.getInputByTreeNode(dsl.getHeaderTreeNodes().get(i));
>>>  if(input instanceof InputNumerical){
>>> query +=
>>> dsl.getHeaderTreeNodes().get(i).getReferentialSetOfValues().getSpaAttName()
>>> + " - " + input.print();
>>>  if(i<dsl.getHeaderTreeNodes().size() -1)
>>> query += " + ";
>>>  }
>>> }
>>> }
>>>  return query + ")) FROM "+tableName+");";
>>> }
>>>
>>> Y bueno, por si os sirviera de algo para diagnosticar alguno de los
>>> muchos fallos que tengo por aquí, dejo también el stack del error en tiempo
>>> de ejecución que me salta cuando intento procesar la consulta:
>>>
>>> getDbfIdForCharset windows-1252 dbfId = 0
>>> *select * from 'gdbms6b0a742e_139006f52eb__8000' where  ( select
>>> min(abs( PERIMET*
>>> *ER - 135.43919372558594 + AREA - 1071.75146484375 + h_p - 0.0)) FROM
>>> gdbms6b0a74*
>>> *2e_139006f52eb__8000);*
>>> Exception in thread "Thread-2624"
>>> com.hardcode.gdbms.parser.SQLEngine$LookaheadS
>>> uccess
>>>         at
>>> com.hardcode.gdbms.parser.SQLEngine.<init>(SQLEngine.java:3462)
>>>         at
>>> com.hardcode.gdbms.engine.data.DataSourceFactory.executeSQL(DataSourc
>>> eFactory.java:1609)
>>>         at
>>> model.spatial.GISOutputExporterVectorLayer.addData(GISOutputExporterV
>>> ectorLayer.java:224)
>>>         at
>>> model.core.Execution.executeRimerCrossValidation(Execution.java:223)
>>>         at model.core.Execution.access$2(Execution.java:210)
>>>         at model.core.Execution$ActualTask.<init>(Execution.java:256)
>>>         at model.core.Execution$2.construct(Execution.java:96)
>>>         at model.threadExec.SwingWorker$2.run(SwingWorker.java:60)
>>>         at java.lang.Thread.run(Unknown Source)
>>>
>>> En negrita es un system.out.println de la consulta que hago.
>>> Decir que cuando hago una consulta simple sin la claúsula "WHERE" sí que
>>> me devuelve un DataSource con todos los registros de mi tabla, por lo que
>>> la tabla, y creo que los campos, sí que son correctos.
>>>
>>> Espero que alguien me pueda echar un cable,
>>>
>>> Muchísimas gracias de antemano,
>>>
>>> Un saludo,
>>>
>>> Alberto
>>>
>>>
>>> --
>>> *--
>>> *
>>>
>>> *Mr Alberto Calzada
>>> Full-time PhD Candidate*
>>>
>>> *Room 16J25 *
>>>
>>> *School of Computing and Mathematics
>>> Faculty of Computing and Engineering*
>>>
>>> *University of Ulster at Jordanstown Campus
>>> Northern Ireland, UK
>>> Email: Calzada-A en email.ulster.ac.uk*
>>>
>>> *Tel:  +44 28 90361114 *
>>>
>>>
>>
>>
>> --
>> *--
>> *
>>
>> *Mr Alberto Calzada
>> Full-time PhD Candidate*
>>
>> *Room 16J25 *
>>
>> *School of Computing and Mathematics
>> Faculty of Computing and Engineering*
>>
>> *University of Ulster at Jordanstown Campus
>> Northern Ireland, UK
>> Email: Calzada-A en email.ulster.ac.uk*
>>
>> *Tel:  +44 28 90361114 *
>>
>>
>> _______________________________________________
>> gvSIG_desarrolladores mailing list
>> gvSIG_desarrolladores en listserv.gva.es
>> Para ver histórico de mensajes, editar sus preferencias de usuario o
>> darse de baja en esta lista, acuda a la siguiente dirección:
>> http://listserv.gva.es/cgi-bin/mailman/listinfo/gvsig_desarrolladores
>>
>>
>
>
> --
> Francisco José Peñarrubia
>
> Equipo gvSIG
> Software Colaborativo
>
> _______________________________________________
> gvSIG_desarrolladores mailing list
> gvSIG_desarrolladores en listserv.gva.es
> Para ver histórico de mensajes, editar sus preferencias de usuario o darse
> de baja en esta lista, acuda a la siguiente dirección:
> http://listserv.gva.es/cgi-bin/mailman/listinfo/gvsig_desarrolladores
>
>


-- 
*--
*

*Mr Alberto Calzada
Full-time PhD Candidate*

*Room 16J25 *

*School of Computing and Mathematics
Faculty of Computing and Engineering*

*University of Ulster at Jordanstown Campus
Northern Ireland, UK
Email: Calzada-A en email.ulster.ac.uk*

*Tel:  +44 28 90361114 *
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: http://listserv.gva.es/pipermail/gvsig_desarrolladores/attachments/20120807/3ba2defd/attachment.htm 


Más información sobre la lista de distribución gvSIG_desarrolladores