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

View differences:

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