Revision 46105 trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.db/org.gvsig.fmap.dal.db.jdbc/src/main/java/org/gvsig/fmap/dal/store/jdbc2/spi/operations/ResultSetForSetProviderOperation.java
ResultSetForSetProviderOperation.java | ||
---|---|---|
60 | 60 |
import org.gvsig.fmap.geom.DataTypes; |
61 | 61 |
import org.gvsig.tools.dynobject.DynField; |
62 | 62 |
import org.gvsig.tools.evaluator.Evaluator; |
63 |
import org.gvsig.tools.lang.CloneableUtils; |
|
63 | 64 |
import org.gvsig.tools.util.ContainerUtils; |
64 | 65 |
|
65 | 66 |
public class ResultSetForSetProviderOperation extends AbstractConnectionOperation { |
... | ... | |
396 | 397 |
if (!StringUtils.isEmpty(baseOrder)) { |
397 | 398 |
select.order_by().custom(baseOrder); |
398 | 399 |
} |
399 |
//Si hay especificado un offset (se esta paginando) siempre deberemos ordenar por un campo con valores unicos. |
|
400 |
//Anadiremos la clave primaria siempre en este caso para asegurarnos de que el orden de los registros es siempre el mismo. |
|
401 |
// if (!select.has_order_by()) { |
|
402 |
// Si no tenemos order by comprobamos si lo necesitamos y lo a?adimos. |
|
403 |
if (offset > 0 || (offset == 0 && limit > 0)) { |
|
404 |
// No tengo claro que (offset==0 && limit>0) sea lo mas correcto, |
|
405 |
// Pero cuando se va a paginar y se pide la primera pagina offset es |
|
406 |
// 0 y limit>0, y si no ordenamos ya esa primera pagina los resultados |
|
407 |
// que se obtienen no son correctos, ya que la primera pagina se saca |
|
408 |
// sin ordenar y el resto ordenadas. |
|
409 |
// Probablemente deberiamos tener alguna otra forma de detectar que |
|
410 |
// estamos paginanado ya que asi no distinguimo si solo queremos |
|
411 |
// obtener los primeros elementos sin importarnos su orden. |
|
412 |
if (select.has_group_by()) { |
|
413 |
ExpressionBuilder.Value group = select.getGroups().get(0); |
|
414 |
// if(!(group instanceof ExpressionBuilder.Function)) { |
|
415 |
// expbuilder.getattr(this.table.getTable(), group.XXX); |
|
416 |
// } |
|
417 |
select.order_by().value(group).ascending(); |
|
418 | 400 |
|
419 |
} else if (primaryKeys.isEmpty()) { |
|
420 |
// Muy probablemente si no tiene pk sea una vista, asi que |
|
421 |
// pasaremos de ordenar y esperemos que la vista este ya ordenada. |
|
422 |
select.disable_check_order_and_offset(); |
|
423 |
} else { |
|
424 |
for (String attrName : primaryKeys) { |
|
425 |
// Se precisa indicar un orden para usar OFFSET. |
|
426 |
if(select.getOrderBy(attrName)==null){ |
|
427 |
select.order_by().column(attrName).ascending(); |
|
428 |
} |
|
429 |
} |
|
401 |
if (select.has_group_by()) { // && isPaginated()) { |
|
402 |
// Cuando paginamos debemos ordenar por las columnas del groupby. |
|
403 |
// Ordenamos siempre para obtener el mismo resultado cuando paginamos |
|
404 |
// y no paginamos. |
|
405 |
for (ExpressionBuilder.Value group : select.getGroups()) { |
|
406 |
if (select.getOrderBy(group) == null) { |
|
407 |
ExpressionBuilder.Value v = (ExpressionBuilder.Value) CloneableUtils.cloneQuietly(group); |
|
408 |
select.order_by().value(v).ascending(); |
|
409 |
valuesToRemoveFeatureType.add(v); |
|
430 | 410 |
} |
431 | 411 |
} |
432 |
// } |
|
433 |
for (String attrName : primaryKeys) { |
|
434 |
if(select.getOrderBy(attrName)==null){ |
|
435 |
select.order_by().column(attrName).ascending(); |
|
412 |
} |
|
413 |
|
|
414 |
if (primaryKeys.isEmpty()) { |
|
415 |
// Muy probablemente si no tiene pk sea una vista, asi que |
|
416 |
// pasaremos de ordenar y esperemos que la vista este ya ordenada. |
|
417 |
select.disable_check_order_and_offset(); |
|
418 |
} else { |
|
419 |
// Siempre ordenamos por la clave primaria |
|
420 |
for (String attrName : primaryKeys) { |
|
421 |
if (select.getOrderBy(attrName) == null) { |
|
422 |
select.order_by().column(attrName).ascending(); |
|
423 |
} |
|
436 | 424 |
} |
437 | 425 |
} |
426 |
|
|
438 | 427 |
if (limit > 0) { |
439 | 428 |
select.limit(limit); |
440 | 429 |
} else { |
... | ... | |
454 | 443 |
for (ExpressionBuilder.Value value : valuesToRemoveFeatureType) { |
455 | 444 |
value.setProperty(PROP_FEATURE_TYPE, null); |
456 | 445 |
} |
457 |
this.helper.expandCalculedColumns(sqlbuilder);
|
|
446 |
this.helper.expandCalculedColumns(sqlbuilder); |
|
458 | 447 |
this.helper.processSpecialFunctions(sqlbuilder, storeType, extraColumnNames); |
459 | 448 |
String sql = sqlbuilder.toString(); |
460 | 449 |
return sql; |
461 | 450 |
} |
451 |
|
|
452 |
private boolean isPaginated() { |
|
453 |
// No tengo claro que (offset==0 && limit>0) sea lo mas correcto, |
|
454 |
// Pero cuando se va a paginar y se pide la primera pagina offset es |
|
455 |
// 0 y limit>0, y si no ordenamos ya esa primera pagina los resultados |
|
456 |
// que se obtienen no son correctos, ya que la primera pagina se saca |
|
457 |
// sin ordenar y el resto ordenadas. |
|
458 |
// Probablemente deberiamos tener alguna otra forma de detectar que |
|
459 |
// estamos paginanado ya que asi no distinguimo si solo queremos |
|
460 |
// obtener los primeros elementos sin importarnos su orden. |
|
461 |
return (offset > 0 || (offset == 0 && limit > 0)); |
|
462 |
} |
|
462 | 463 |
|
463 | 464 |
public ResultSetEntry createResultSet() throws DataException { |
464 | 465 |
List<FeatureAttributeDescriptor> columns = new ArrayList<>(); |
Also available in: Unified diff