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

Francisco José Peñarrubia fpenarru en gmail.com
Mar Ago 7 13:34:37 CEST 2012


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
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: http://listserv.gva.es/pipermail/gvsig_desarrolladores/attachments/20120807/29a29aea/attachment.htm 


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