Revision 46401 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
35 35
import org.gvsig.expressionevaluator.ExpressionBuilder;
36 36
import static org.gvsig.expressionevaluator.ExpressionBuilder.FUNCTION_LET;
37 37
import org.gvsig.expressionevaluator.ExpressionUtils;
38
import org.gvsig.fmap.dal.SQLBuilder;
39
import org.gvsig.fmap.dal.SQLBuilder.OrderByBuilder;
38 40
import org.gvsig.fmap.dal.SQLBuilder.SelectBuilder;
39 41
import org.gvsig.fmap.dal.exception.DataException;
40 42
import org.gvsig.fmap.dal.expressionevaluator.FeatureAttributeEmulatorExpression;
......
437 439
            for (FeatureQueryOrderMember member : order.members()) {
438 440
                String attrName = member.getAttributeName();
439 441
                if (member.hasEvaluator()) {
442
                    // Order-by una expression en el query
440 443
                    String sqlorder = member.getEvaluator().getSQL();
441 444
                    select.order_by()
442 445
                            .value(expbuilder.toValue(sqlorder))
443 446
                            .ascending(member.getAscending());
444 447
                } else {
448
                    int nullsMode = OrderByBuilder.MODE_NULLS_LAST;
445 449
                    if (allExtraColumns.get(attrName) != null) {
450
                        // Order-by por una columna extra
446 451
                        Expression exp = ((FeatureAttributeEmulatorExpression) allExtraColumns.get(attrName).getFeatureAttributeEmulator()).getExpression();
447 452
                        if (!select.has_column(attrName)) {
448 453
                            select.column().value(exp.getCode().toValue()).as(attrName);
......
451 456
                            extraColumnNames.add(attrName);
452 457
                        }
453 458
                    } else if (setType.get(attrName) != null && setType.getAttributeDescriptor(attrName).isComputed()) {
459
                        // Order-by por un campo calculado del set/store
454 460
                        Expression exp = ((FeatureAttributeEmulatorExpression) setType.getAttributeDescriptor(attrName).getFeatureAttributeEmulator()).getExpression();
455 461
                        if (!select.has_column(attrName)) {
456 462
                            select.column().value(exp.getCode().toValue()).as(attrName);
......
458 464
                        if (extraColumnNames!=null && !extraColumnNames.contains(attrName)) {
459 465
                            extraColumnNames.add(attrName);
460 466
                        }
467
                    } else {
468
                        // Order-by por un campo del store
469
                        FeatureAttributeDescriptor attr = storeType.getAttributeDescriptor(attrName);
470
                        if( attr!=null && (!attr.allowNull() || attr.isPrimaryKey()) ) {
471
                            // Puede ser costoso ordenar los nulos al principio o final, asi que
472
                            // si el campo no admite nulos pasamos de indicarselo.
473
                            nullsMode = OrderByBuilder.MODE_NULLS_NOT_SPECIFIED;
474
                        }
461 475
                    }
462 476
                    ExpressionBuilder.Variable col = expbuilder.column(attrName);
463 477
					
464
                    // En el groupBy no queremos que se sustituya el nombre del campo calculado
478
                    // En el OrderBy no queremos que se sustituya el nombre del campo calculado
465 479
                    // por su expresion. Se encarga el formater y lo evitamos quitandole el ftype
466 480
                    // al value.
467 481
                    valuesToRemoveFeatureType.add(col);
468
                    select.order_by().value(col).ascending(member.getAscending());
469
//                    select.order_by()
470
//                            .column(member.getAttributeName())
471
//                            .ascending(member.getAscending());
482
                    select.order_by().value(col).ascending(member.getAscending()).nulls(nullsMode);
472 483
                }
473 484
            }
474 485
        }
......
484 495
            for (ExpressionBuilder.Value group : select.getGroups()) {
485 496
                if (select.getOrderBy(group) == null) {
486 497
                    ExpressionBuilder.Value v = (ExpressionBuilder.Value) CloneableUtils.cloneQuietly(group);
487
                    select.order_by().value(v).ascending();
498
                    select.order_by().value(v).ascending().nulls(OrderByBuilder.MODE_NULLS_LAST);
488 499
                    valuesToRemoveFeatureType.add(v);
489 500
                }
490 501
            }
......
500 511
            if( x==null || !DataTypeUtils.toBoolean(x) ) {
501 512
                for (String attrName : primaryKeys) {
502 513
                    if (select.getOrderBy(attrName) == null) {
503
                        select.order_by().column(attrName).ascending();
514
                        select.order_by()
515
                                .column(attrName)
516
                                .ascending()
517
                                .nulls(OrderByBuilder.MODE_NULLS_NOT_SPECIFIED)
518
                                ;
519
                        // No tengo claro que pasa si se esta agrupando, y no se ha
520
                        // incluido en el agrupamiento al PK. En ese caso el select
521
                        // que se genera tendria una pinta tal que asi:
522
                        //   SELECT NULL as pk, ... ORDER BY pk ASC
523
                        // Probablemente en ese caso no tendriamos que meter la PK
524
                        // en el order-by ya que creo que no cambiaria el resultado.
504 525
                    }
505 526
                }
506 527
            }

Also available in: Unified diff