Revision 46806 trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.spi/src/main/java/org/gvsig/fmap/dal/feature/spi/SQLBuilderBase.java

View differences:

SQLBuilderBase.java
56 56
import org.gvsig.tools.dataTypes.DataType;
57 57
import org.gvsig.tools.dynobject.Tags;
58 58
import org.gvsig.tools.lang.CloneableUtils;
59
import org.gvsig.tools.util.Bitmask;
59 60
import org.gvsig.tools.util.PropertiesSupport;
60 61
import org.slf4j.Logger;
61 62
import org.slf4j.LoggerFactory;
......
2309 2310
    public class AlterTableBuilderBase
2310 2311
            extends AbstractStatement
2311 2312
            implements AlterTableBuilder {
2312

  
2313
             
2313 2314
        protected TableNameBuilder table;
2314 2315
        protected List<String> drops;
2315 2316
        protected List<ColumnDescriptor> adds;
2317
        
2318
        // alters debera dejarse de usar en fabor de operation_alters
2319
        @Deprecated
2316 2320
        protected List<ColumnDescriptor> alters;
2321
        protected List<Pair<Bitmask,ColumnDescriptor>> operations;
2322
        
2317 2323
        protected List<Pair<String, String>> renames;
2318 2324
        protected String drop_primary_key_column;
2319 2325

  
......
2321 2327
            this.drops = new ArrayList<>();
2322 2328
            this.adds = new ArrayList<>();
2323 2329
            this.alters = new ArrayList<>();
2330
            this.operations = new ArrayList<>();
2324 2331
            this.renames = new ArrayList<>();
2325 2332
        }
2326 2333

  
2334
        public List<Pair<Bitmask,ColumnDescriptor>> getOperations() {
2335
            return this.operations;
2336
        }
2337
        
2327 2338
        @Override
2328 2339
        public boolean isEmpty() {
2329 2340
            return this.drops.isEmpty()
2330 2341
                    && this.adds.isEmpty()
2331 2342
                    && this.alters.isEmpty()
2343
                    && this.operations.isEmpty()
2332 2344
                    && this.renames.isEmpty();
2333 2345
        }
2334 2346

  
......
2400 2412
            return this;
2401 2413
        }
2402 2414

  
2415
        private void update_or_add_alters(ColumnDescriptorBase column) {
2416
            int i = 0;
2417
            for (; i < alters.size(); i++) {
2418
                ColumnDescriptor prevColumn = alters.get(i);
2419
                if( prevColumn.getName().equalsIgnoreCase(column.getName()) ) {
2420
                    // Si ya existia la actualizamos
2421
                    alters.set(i, column);
2422
                    break;
2423
                }
2424
                
2425
            }
2426
            if( i >= alters.size() ) {
2427
                // Si no existis la a?adimos
2428
                this.alters.add(column);
2429
            }
2430
        }
2431
        
2403 2432
        @Override
2404 2433
        public AlterTableBuilder alter_column(FeatureAttributeDescriptor fad) {
2405
            this.alters.add(new ColumnDescriptorBase(fad));
2434
            ColumnDescriptorBase column = new ColumnDescriptorBase(fad);
2435
            update_or_add_alters(column);
2436
            Bitmask operation = Bitmask.createBitmask(0);
2437
            operation.setBit(ALTER_COLUMN_ALL);
2438
            this.operations.add(new ImmutablePair<>(operation,column));
2406 2439
            return this;
2407 2440
        }
2408 2441

  
2409 2442
        @Override
2410 2443
        public AlterTableBuilder alter_column(String columnName, int type, int size, int precision, int scale, boolean isPk, boolean isIndexed, boolean allowNulls, boolean isAutomatic, Object defaultValue) {
2411
            if (isPk || isAutomatic) {
2444
            if ( (isPk || isAutomatic) && allowNulls) {
2412 2445
                allowNulls = false;
2413 2446
            }
2414
            this.alters.add(new ColumnDescriptorBase(columnName, type, size, precision, scale, isPk, isIndexed, allowNulls, isAutomatic, defaultValue));
2447
            ColumnDescriptorBase column = new ColumnDescriptorBase(columnName, type, size, precision, scale, isPk, isIndexed, allowNulls, isAutomatic, defaultValue);
2448
            update_or_add_alters(column);
2449
            Bitmask operation = Bitmask.createBitmask(0);
2450
            operation.setBit(ALTER_COLUMN_ALL);
2451
            this.operations.add(new ImmutablePair<>(operation,column));
2415 2452
            return this;
2416 2453
        }
2417 2454

  
2418 2455
        @Override
2456
        public AlterTableBuilder alter_column(Bitmask operation,String columnName, int type, int size, int precision, int scale, boolean isPk, boolean isIndexed, boolean allowNulls, boolean isAutomatic, Object defaultValue) {
2457
            if ( (isPk || isAutomatic) && allowNulls) {
2458
                allowNulls = false;
2459
                operation.setBit(ALTER_COLUMN_SET_NULL);
2460
            }
2461
            ColumnDescriptorBase column = new ColumnDescriptorBase(columnName, type, size, precision, scale, isPk, isIndexed, allowNulls, isAutomatic, defaultValue);
2462
            update_or_add_alters(column);
2463
            this.operations.add(new ImmutablePair<>(operation,column));
2464
            return this;
2465
        }
2466

  
2467
        @Override
2419 2468
        public AlterTableBuilder alter_geometry_column(String columnName, int type, int subtype, IProjection proj, boolean isIndexed, boolean allowNulls) {
2420 2469
            if (StringUtils.isEmpty(columnName)) {
2421 2470
                throw new IllegalArgumentException("Argument 'columnName' can't be empty.");
2422 2471
            }
2423
            this.alters.add(new ColumnDescriptorBase(columnName, type, subtype, proj, isIndexed, allowNulls));
2472
            ColumnDescriptorBase column = new ColumnDescriptorBase(columnName, type, subtype, proj, isIndexed, allowNulls);
2473
            update_or_add_alters(column);
2474
            Bitmask operation = Bitmask.createBitmask(0);
2475
            operation.setBit(ALTER_COLUMN_GEOMETRY);
2476
            this.operations.add(new ImmutablePair<>(operation,column));
2424 2477
            return this;
2425 2478
        }
2426 2479

  
......
2429 2482
            if (StringUtils.isEmpty(columnName)) {
2430 2483
                throw new IllegalArgumentException("Argument 'columnName' can't be empty.");
2431 2484
            }
2432
            this.alters.add(new ColumnDescriptorBase(columnName, type, subtype, srsdbcode, isIndexed, allowNulls));
2485
            ColumnDescriptorBase column = new ColumnDescriptorBase(columnName, type, subtype, srsdbcode, isIndexed, allowNulls);
2486
            update_or_add_alters(column);
2487
            Bitmask operation = Bitmask.createBitmask(0);
2488
            operation.setBit(ALTER_COLUMN_GEOMETRY);
2489
            this.operations.add(new ImmutablePair<>(operation,column));
2433 2490
            return this;
2434 2491
        }
2435 2492

  
......
2445 2502
            return constraint_name;
2446 2503
        }
2447 2504

  
2505
        protected List<String> alter_table_add_primarykey_sqls(Formatter<Value> formatter, ColumnDescriptor column) {
2506
            // ALTER TABLE table_name ADD CONSTRAINT IF NOT EXISTS constraint_name PRIMARY KEY(column_name)
2507
            List<String> sqls = new ArrayList<>();
2508
            StringBuilder builder = new StringBuilder();
2509
            builder.append("ALTER TABLE ");
2510
            builder.append(this.table.toString(formatter));
2511
            builder.append(" ADD CONSTRAINT ");
2512
            builder.append("IF NOT EXISTS ");
2513
            builder.append(as_identifier(getConstrainName("PK",column.getName())));
2514
            builder.append(" PRIMARY KEY( ");
2515
            builder.append(as_identifier(column.getName()));
2516
            builder.append(" )");
2517
            sqls.add(builder.toString());
2518
            return sqls;
2519
        }
2520

  
2521
        protected List<String> alter_table_drop_primarykey_sqls(Formatter<Value> formatter, ColumnDescriptor column) {
2522
            // ALTER TABLE table_name DROP CONSTRAINT constraint_name
2523
            StringBuilder builder = new StringBuilder();
2524
            builder.append("ALTER TABLE ");
2525
            builder.append(this.table.toString(formatter));
2526
            builder.append(" DROP CONSTRAINT ");
2527
            builder.append("IF EXISTS ");
2528
            builder.append(as_identifier(getConstrainName("PK",column.getName())));
2529
            return Collections.singletonList(builder.toString());
2530
        }
2531
        
2532
        protected List<String> create_index_sqls(Formatter<Value> formatter, ColumnDescriptor column) {
2533
            // CREATE INDEX IF NOT EXISTS idx_name ON table_name ( column_name )",
2534
            StringBuilder builder = new StringBuilder();
2535
            builder.append("CREATE INDEX ");
2536
            builder.append("IF NOT EXISTS ");
2537
            builder.append(as_identifier(getConstrainName("IDX",column.getName())));
2538
            builder.append(" ON ");
2539
            builder.append(this.table.toString(formatter));
2540
            builder.append(" ( ");
2541
            builder.append(as_identifier(column.getName()));
2542
            builder.append(" )");
2543
            return Collections.singletonList(builder.toString());
2544
        }
2545

  
2546
        protected List<String> drop_index_sqls(Formatter<Value> formatter, ColumnDescriptor column) {
2547
            // DROP INDEX IF EXISTS idx_name",
2548
            StringBuilder builder = new StringBuilder();
2549
            builder.append("DROP INDEX ");
2550
            builder.append("IF EXISTS ");
2551
            builder.append(as_identifier(getConstrainName("IDX",column.getName())));
2552
            return Collections.singletonList(builder.toString());
2553
        }
2554

  
2555
        protected List<String> alter_table_alter_column_set_data_type_sqls(Formatter<Value> formatter, ColumnDescriptor column) {
2556
            StringBuilder builder = new StringBuilder();
2557
            builder.append("ALTER TABLE ");
2558
            builder.append(this.table.toString(formatter));
2559
            builder.append(" ALTER COLUMN ");
2560
            builder.append(as_identifier(column.getName()));
2561
            builder.append(" SET DATA TYPE ");
2562
            if (column.getType() == DataTypes.INT && column.isAutomatic()) {
2563
                builder.append(" SERIAL");
2564
            } else {
2565
                builder.append(
2566
                        sqltype(
2567
                                column.getType(),
2568
                                column.getSize(),
2569
                                column.getPrecision(),
2570
                                column.getScale(),
2571
                                column.getGeometryType(),
2572
                                column.getGeometrySubtype()
2573
                        )
2574
                );
2575
            }
2576
            return Collections.singletonList(builder.toString());
2577
        }
2578
        
2579
        protected List<String> alter_table_alter_column_set_default_sqls(Formatter<Value> formatter, ColumnDescriptor column) {
2580
            StringBuilder builder = new StringBuilder();
2581
            builder.append("ALTER TABLE ");
2582
            builder.append(this.table.toString(formatter));
2583
            builder.append(" ALTER COLUMN ");
2584
            builder.append(as_identifier(column.getName()));
2585
            if (column.getDefaultValue() == null) {
2586
                if (column.allowNulls()) {
2587
                    builder.append(" SET DEFAULT NULL");
2588
                } else {
2589
                    builder.append(" DROP DEFAULT");
2590
                }
2591
            } else {
2592
                builder.append(" SET DEFAULT '");
2593
                builder.append(column.getDefaultValue().toString());
2594
                builder.append("'");
2595
            }
2596
            return Collections.singletonList(builder.toString());
2597
        }
2598

  
2599
        protected List<String> alter_table_alter_column_set_null_sqls(Formatter<Value> formatter, ColumnDescriptor column) {
2600
            StringBuilder builder = new StringBuilder();
2601
            builder.append("ALTER TABLE ");
2602
            builder.append(this.table.toString(formatter));
2603
            builder.append(" ALTER COLUMN ");
2604
            builder.append(as_identifier(column.getName()));
2605
            if (column.allowNulls()) {
2606
                builder.append(" SET NULL");
2607
            } else {
2608
                builder.append(" SET NOT NULL");
2609
            }
2610
            return Collections.singletonList(builder.toString());
2611
        }
2612

  
2613
        protected List<String> alter_table_drop_column_sqls(Formatter<Value> formatter, String columnName) {
2614
            StringBuilder builder = new StringBuilder();
2615
            builder.append("ALTER TABLE ");
2616
            builder.append(this.table.toString(formatter));
2617
            builder.append(" DROP COLUMN ");
2618
            builder.append(" IF EXISTS ");
2619
            builder.append(as_identifier(columnName));
2620
            return Collections.singletonList(builder.toString());
2621
        }
2622

  
2623
        protected List<String> alter_table_add_column_sqls(Formatter<Value> formatter, ColumnDescriptor column) {
2624
            List<String> sqls = new ArrayList<>();
2625
            StringBuilder builder = new StringBuilder();
2626
            builder.append("ALTER TABLE ");
2627
            builder.append(this.table.toString(formatter));
2628
            builder.append(" ADD COLUMN ");
2629
            builder.append(as_identifier(column.getName()));
2630
            builder.append(" ");
2631
            if (column.getType() == DataTypes.INT && column.isAutomatic()) {
2632
                builder.append(" SERIAL");
2633
            } else {
2634
                builder.append(
2635
                        sqltype(
2636
                                column.getType(),
2637
                                column.getSize(),
2638
                                column.getPrecision(),
2639
                                column.getScale(),
2640
                                column.getGeometryType(),
2641
                                column.getGeometrySubtype()
2642
                        )
2643
                );
2644
            }
2645
            if (column.getDefaultValue() == null) {
2646
                if (column.allowNulls()) {
2647
                    builder.append(" DEFAULT NULL");
2648
                }
2649
            } else {
2650
                builder.append(" DEFAULT '");
2651
                builder.append(Objects.toString(column.getDefaultValue(),""));
2652
                builder.append("'");
2653
            }
2654
            if (column.allowNulls()) {
2655
                builder.append(" NULL");
2656
            } else {
2657
                builder.append(" NOT NULL");
2658
            }
2659
            if (column.isPrimaryKey()) {
2660
                builder.append(" PRIMARY KEY");
2661
            }
2662
            sqls.add(builder.toString());
2663
            
2664
            if( column.isGeometry() ) {
2665
                sqls.addAll(alter_column_add_geometry_constraint_sqls(formatter, column));
2666
            }
2667
            if( column.isIndexed() ) {
2668
                sqls.addAll(create_index_sqls(formatter, column));
2669
            }
2670
            return sqls;
2671
        }
2672

  
2673
        protected List<String> alter_table_alter_column_rename_sqls(Formatter<Value> formatter, String oldName, String newName) {
2674
            StringBuilder builder = new StringBuilder();
2675
            builder.append("ALTER TABLE ");
2676
            builder.append(this.table.toString(formatter));
2677
            builder.append(" ALTER COLUMN ");
2678
            builder.append(as_identifier(oldName));
2679
            builder.append(" RENAME TO ");
2680
            builder.append(as_identifier(newName));
2681
            return Collections.singletonList(builder.toString());
2682
        }
2683

  
2684
        protected List<String> alter_column_add_geometry_constraint_sqls(Formatter<ExpressionBuilder.Value> formatter, ColumnDescriptor column) {
2685
            return Collections.EMPTY_LIST;
2686
        }
2687
        
2448 2688
        @Override
2449 2689
        public String toString() {
2450 2690
            return this.toString(formatter());
......
2483 2723
                return sqls;
2484 2724
            }
2485 2725
            for (String column : drops) {
2486
                StringBuilder builder = new StringBuilder();
2487
                builder.append("ALTER TABLE ");
2488
                builder.append(this.table.toString(formatter));
2489
                builder.append(" DROP COLUMN IF EXISTS ");
2490
                builder.append(as_identifier(column));
2491
                sqls.add(builder.toString());
2726
                sqls.addAll(alter_table_drop_column_sqls(formatter, column));
2492 2727
            }
2493 2728
            for (ColumnDescriptor column : adds) {
2494
                StringBuilder builder = new StringBuilder();
2495
                builder.append("ALTER TABLE ");
2496
                builder.append(this.table.toString(formatter));
2497
                builder.append(" ADD COLUMN ");
2498
                builder.append(as_identifier(column.getName()));
2499
                builder.append(" ");
2500
                if (column.getType() == DataTypes.INT && column.isAutomatic()) {
2501
                    builder.append(" SERIAL");
2502
                } else {
2503
                    builder.append(
2504
                            sqltype(
2505
                                    column.getType(),
2506
                                    column.getSize(),
2507
                                    column.getPrecision(),
2508
                                    column.getScale(),
2509
                                    column.getGeometryType(),
2510
                                    column.getGeometrySubtype()
2511
                            )
2512
                    );
2513
                }
2514
                if (column.getDefaultValue() == null) {
2515
                    if (column.allowNulls()) {
2516
                        builder.append(" DEFAULT NULL");
2517
                    }
2518
                } else {
2519
                    builder.append(" DEFAULT '");
2520
                    builder.append(Objects.toString(column.getDefaultValue(),""));
2521
                    builder.append("'");
2522
                }
2523
                if (column.allowNulls()) {
2524
                    builder.append(" NULL");
2525
                } else {
2526
                    builder.append(" NOT NULL");
2527
                }
2528
                if (column.isPrimaryKey()) {
2529
                    builder.append(" PRIMARY KEY");
2530
                }
2531
                sqls.add(builder.toString());
2729
                sqls.addAll(alter_table_add_column_sqls(formatter, column));
2532 2730
            }
2533
            for (ColumnDescriptor column : alters) {
2534
                StringBuilder builder = new StringBuilder();
2535
                builder.append("ALTER TABLE ");
2536
                builder.append(this.table.toString(formatter));
2537
                builder.append(" ALTER COLUMN ");
2538
                builder.append(as_identifier(column.getName()));
2539
                builder.append(" SET DATA TYPE ");
2540
                if (column.getType() == DataTypes.INT && column.isAutomatic()) {
2541
                    builder.append(" SERIAL");
2542
                } else {
2543
                    builder.append(
2544
                            sqltype(
2545
                                    column.getType(),
2546
                                    column.getSize(),
2547
                                    column.getPrecision(),
2548
                                    column.getScale(),
2549
                                    column.getGeometryType(),
2550
                                    column.getGeometrySubtype()
2551
                            )
2552
                    );
2553
                }
2554
                sqls.add(builder.toString());
2555
            }
2556
            for (ColumnDescriptor column : alters) {
2557
                StringBuilder builder = new StringBuilder();
2558
                builder.append("ALTER TABLE ");
2559
                builder.append(this.table.toString(formatter));
2560
                builder.append(" ALTER COLUMN ");
2561
                builder.append(as_identifier(column.getName()));
2562
                if (column.getDefaultValue() == null) {
2563
                    if (column.allowNulls()) {
2564
                        builder.append(" SET DEFAULT NULL");
2731
            for (Pair<Bitmask,ColumnDescriptor> operationAndColumn : this.getOperations()) {
2732
                Bitmask operation = operationAndColumn.getLeft();
2733
                ColumnDescriptor column = operationAndColumn.getRight();
2734
                if( operation.isSetBit(ALTER_COLUMN_ALL) ) {
2735
                    if( column.isPrimaryKey() ) {
2736
                        sqls.addAll(alter_table_add_primarykey_sqls(formatter, column));
2565 2737
                    } else {
2566
                        builder.append(" DROP DEFAULT");
2738
                        sqls.addAll(alter_table_drop_primarykey_sqls(formatter, column));
2739
                        if( column.isIndexed() ) {
2740
                            sqls.addAll(create_index_sqls(formatter, column));
2741
                        }
2567 2742
                    }
2743
                    sqls.addAll(alter_table_alter_column_set_data_type_sqls(formatter, column));
2744
                    sqls.addAll(alter_table_alter_column_set_default_sqls(formatter, column));
2745
                    sqls.addAll(alter_table_alter_column_set_null_sqls(formatter, column));
2746
                    if( column.isGeometry() ) {
2747
                        sqls.addAll(alter_column_add_geometry_constraint_sqls(formatter, column));
2748
                    }
2568 2749
                } else {
2569
                    builder.append(" SET DEFAULT '");
2570
                    builder.append(column.getDefaultValue().toString());
2571
                    builder.append("'");
2750
                    if( operation.isSetBit(ALTER_COLUMN_SET_NULL) ) { // Debe ir antes del "add primary key"
2751
                        sqls.addAll(alter_table_alter_column_set_null_sqls(formatter, column));
2752
                    }
2753
                    
2754
                    if( operation.isSetBit(ALTER_COLUMN_SET_DATA_TYPE) ) {
2755
                        sqls.addAll(alter_table_alter_column_set_data_type_sqls(formatter, column));
2756
                    }
2757
                    
2758
                    if( operation.isSetBit(ALTER_COLUMN_ADD_PRIMARY_KEY) ) {
2759
                        sqls.addAll(alter_table_add_primarykey_sqls(formatter, column));
2760
                    }
2761
                    
2762
                    if( operation.isSetBit(ALTER_COLUMN_DROP_PRIMARY_KEY) ) {
2763
                        sqls.addAll(alter_table_drop_primarykey_sqls(formatter, column));
2764
                    }
2765
                    
2766
                    if( operation.isSetBit(ALTER_COLUMN_SET_DEFAULT) ) {
2767
                        sqls.addAll(alter_table_alter_column_set_default_sqls(formatter, column));
2768
                    }
2769
                    
2770
                    if( operation.isSetBit(ALTER_COLUMN_CREATE_INDEX) ) {
2771
                        sqls.addAll(create_index_sqls(formatter, column));
2772
                    }
2773
                    
2774
                    if( operation.isSetBit(ALTER_COLUMN_DROP_INDEX) ) {
2775
                        sqls.addAll(drop_index_sqls(formatter, column));
2776
                    }
2777
                    
2778
                    if( operation.isSetBit(ALTER_COLUMN_GEOMETRY) ) {
2779
                        if( column.isGeometry() ) {
2780
                            sqls.addAll(alter_column_add_geometry_constraint_sqls(formatter, column));
2781
                        }
2782
                    }
2783
                        
2572 2784
                }
2573
                sqls.add(builder.toString());
2574 2785
            }
2786
            
2575 2787
            for (Pair<String, String> pair : renames) {
2576
                StringBuilder builder = new StringBuilder();
2577
                builder.append("ALTER TABLE ");
2578
                builder.append(this.table.toString(formatter));
2579
                builder.append(" RENAME COLUMN ");
2580
                builder.append(as_identifier(pair.getLeft()));
2581
                builder.append(" TO ");
2582
                builder.append(as_identifier(pair.getRight()));
2583
                sqls.add(builder.toString());
2788
                sqls.addAll(alter_table_alter_column_rename_sqls(formatter, pair.getLeft(), pair.getRight()));
2584 2789
            }
2585 2790
            return sqls;
2586 2791
        }
......
2771 2976
                    builder.append(Objects.toString(column.getDefaultValue(),""));
2772 2977
                    builder.append("'");
2773 2978
                }
2774
                if (column.allowNulls()) {
2775
                    builder.append(" NULL");
2776
                } else {
2979
                if (column.isPrimaryKey()) {
2777 2980
                    builder.append(" NOT NULL");
2778
                }
2779
                if (column.isPrimaryKey()) {
2780 2981
                    builder.append(" PRIMARY KEY");
2982
                } else {
2983
                    if (column.allowNulls()) {
2984
                        builder.append(" NULL");
2985
                    } else {
2986
                        builder.append(" NOT NULL");
2987
                    }
2781 2988
                }
2782 2989
            }
2783 2990
            builder.append(" )");
......
3440 3647
    protected DropIndexBuilder createDropIndexBuilder() {
3441 3648
        return new DropIndexBuilderBase();
3442 3649
    }
3443

  
3650
    
3444 3651
    @Override
3445 3652
    public SelectBuilder select() {
3446 3653
        if (this.select == null) {

Also available in: Unified diff