This Bugzilla instance is a read-only archive of historic NetBeans bug reports. To report a bug in NetBeans please follow the project's instructions for reporting issues.

View | Details | Raw Unified | Return to bug 227588
Collapse All | Expand All

(-)a/db.dataview/src/org/netbeans/modules/db/dataview/meta/DBPrimaryKey.java (-3 / +21 lines)
Lines 43-53 Link Here
43
 */
43
 */
44
package org.netbeans.modules.db.dataview.meta;
44
package org.netbeans.modules.db.dataview.meta;
45
45
46
import java.util.ArrayList;
47
import java.util.Collections;
46
import java.util.Collections;
48
import java.util.List;
47
import java.util.List;
49
import java.sql.ResultSet;
48
import java.sql.ResultSet;
50
import java.sql.SQLException;
49
import java.sql.SQLException;
50
import java.util.ArrayList;
51
import java.util.HashMap;
52
import java.util.Map;
51
import org.netbeans.modules.db.dataview.util.DataViewUtils;
53
import org.netbeans.modules.db.dataview.util.DataViewUtils;
52
54
53
/**
55
/**
Lines 58-78 Link Here
58
public final class DBPrimaryKey extends DBObject<DBTable> {
60
public final class DBPrimaryKey extends DBObject<DBTable> {
59
    private static final String RS_COLUMN_NAME = "COLUMN_NAME"; // NOI18N
61
    private static final String RS_COLUMN_NAME = "COLUMN_NAME"; // NOI18N
60
    private static final String RS_KEY_NAME = "PK_NAME"; // NOI18N
62
    private static final String RS_KEY_NAME = "PK_NAME"; // NOI18N
63
    private static final String RS_KEY_SEQ = "KEY_SEQ"; // NOI18N
61
    private List<String> columnNames;
64
    private List<String> columnNames;
62
    private String name;
65
    private String name;
63
    private DBTable parent;
66
    private DBTable parent;
64
67
65
    public DBPrimaryKey(ResultSet rs) throws SQLException {
68
    public DBPrimaryKey(ResultSet rs) throws SQLException {
66
        assert rs != null;
69
        assert rs != null;
67
        columnNames = new ArrayList<String>();
70
71
        Map<Integer,String> pkColumns = new HashMap<Integer,String>();
72
        
68
        while (rs.next()) {
73
        while (rs.next()) {
74
            int keySeq = rs.getShort(RS_KEY_SEQ);
75
            String columName = rs.getString(RS_COLUMN_NAME);
76
            
77
            pkColumns.put(keySeq, columName);
78
69
            name = rs.getString(RS_COLUMN_NAME);
79
            name = rs.getString(RS_COLUMN_NAME);
70
            columnNames.add(rs.getString(RS_COLUMN_NAME));
71
            String tmpName = rs.getString(RS_KEY_NAME);
80
            String tmpName = rs.getString(RS_KEY_NAME);
72
            if (!DataViewUtils.isNullString(tmpName) && name == null) {
81
            if (!DataViewUtils.isNullString(tmpName) && name == null) {
73
                name = tmpName;
82
                name = tmpName;
74
            }
83
            }
75
        }
84
        }
85
        
86
        columnNames = new ArrayList<String>();
87
        
88
        List<Integer> columnEntries = new ArrayList<Integer>(pkColumns.keySet());
89
        Collections.sort(columnEntries);
90
        
91
        for(Integer id: columnEntries) {
92
            columnNames.add(pkColumns.get(id));
93
        }
76
    }
94
    }
77
95
78
    public boolean contains(DBColumn col) {
96
    public boolean contains(DBColumn col) {
(-)a/db.dataview/src/org/netbeans/modules/db/dataview/output/DataViewDBTable.java (-1 lines)
Lines 52-58 Link Here
52
import java.util.Map;
52
import java.util.Map;
53
import org.netbeans.modules.db.dataview.meta.DBColumn;
53
import org.netbeans.modules.db.dataview.meta.DBColumn;
54
import org.netbeans.modules.db.dataview.meta.DBTable;
54
import org.netbeans.modules.db.dataview.meta.DBTable;
55
import org.netbeans.modules.db.dataview.util.DataViewUtils;
56
55
57
/**
56
/**
58
 * Wrapper class provides ordered columns and tooltips
57
 * Wrapper class provides ordered columns and tooltips
(-)a/db.dataview/src/org/netbeans/modules/db/dataview/output/SQLStatementGenerator.java (-15 / +28 lines)
Lines 45-53 Link Here
45
45
46
import java.sql.Blob;
46
import java.sql.Blob;
47
import java.sql.Clob;
47
import java.sql.Clob;
48
import java.sql.Connection;
49
import java.sql.SQLException;
48
import java.sql.SQLException;
50
import java.sql.Types;
49
import java.sql.Types;
50
import java.util.ArrayList;
51
import java.util.HashSet;
51
import java.util.HashSet;
52
import java.util.List;
52
import java.util.List;
53
import java.util.Map;
53
import java.util.Map;
Lines 55-61 Link Here
55
import java.util.logging.Level;
55
import java.util.logging.Level;
56
import java.util.logging.Logger;
56
import java.util.logging.Logger;
57
import org.netbeans.modules.db.dataview.meta.DBColumn;
57
import org.netbeans.modules.db.dataview.meta.DBColumn;
58
import org.netbeans.modules.db.dataview.meta.DBConnectionFactory;
59
import org.netbeans.modules.db.dataview.meta.DBException;
58
import org.netbeans.modules.db.dataview.meta.DBException;
60
import org.netbeans.modules.db.dataview.meta.DBMetaDataFactory;
59
import org.netbeans.modules.db.dataview.meta.DBMetaDataFactory;
61
import org.netbeans.modules.db.dataview.meta.DBPrimaryKey;
60
import org.netbeans.modules.db.dataview.meta.DBPrimaryKey;
Lines 367-379 Link Here
367
        }
366
        }
368
    }
367
    }
369
368
370
    private void generateWhereCondition(DBTable table, StringBuilder result, List<Integer> types, List<Object> values, int rowNum, DataViewTableUIModel model) {
369
    void generateWhereCondition(DBTable table, StringBuilder result, List<Integer> types, List<Object> values, int rowNum, DataViewTableUIModel model) {
371
        DBPrimaryKey key = table.getPrimaryKey();
370
        DBPrimaryKey key = table.getPrimaryKey();
372
        boolean keySelected = false;
371
        Set<String> columnsSelected = new HashSet<String>();
373
        boolean and = false;
372
        boolean and = false;
374
373
375
        List<DBColumn> columns = table.getColumnList();
374
        List<DBColumn> columns = table.getColumnList();
376
        
375
        
376
        StringBuilder pkSelect = new StringBuilder();
377
        List<Integer> pkTypes = new ArrayList<Integer>();
378
        List<Object> pkObject = new ArrayList<Object>();
379
        
377
        if (key != null) {
380
        if (key != null) {
378
            for (String keyName : key.getColumnNames()) {
381
            for (String keyName : key.getColumnNames()) {
379
                for (int i = 0; i < model.getColumnCount(); i++) {
382
                for (int i = 0; i < model.getColumnCount(); i++) {
Lines 382-390 Link Here
382
                    if (columnName.equals(keyName)) {
385
                    if (columnName.equals(keyName)) {
383
                        Object val = model.getOriginalValueAt(rowNum, i);
386
                        Object val = model.getOriginalValueAt(rowNum, i);
384
                        if (val != null) {
387
                        if (val != null) {
385
                            keySelected = true;
388
                            columnsSelected.add(columnName);
386
                            and = addSeparator(and, result, " AND "); // NOI18N
389
                            and = addSeparator(and, pkSelect, " AND "); // NOI18N
387
                            generateNameValue(dbcol, result, val, values, types);
390
                            generateNameValue(dbcol, pkSelect, val, pkObject, pkTypes);
388
                            break;
391
                            break;
389
                        }
392
                        }
390
                    }
393
                    }
Lines 392-398 Link Here
392
            }
395
            }
393
        }
396
        }
394
397
395
        if (key == null || !keySelected) {
398
        if(key != null && columnsSelected.equals(new HashSet<String>(key.getColumnNames()))) {
399
            result.append(pkSelect);
400
            types.addAll(pkTypes);
401
            values.addAll(pkObject);
402
        } else {
403
            and = false;
396
            for (int i = 0; i < model.getColumnCount(); i++) {
404
            for (int i = 0; i < model.getColumnCount(); i++) {
397
                DBColumn dbcol = columns.get(i);
405
                DBColumn dbcol = columns.get(i);
398
                Object val = model.getOriginalValueAt(rowNum, i);
406
                Object val = model.getOriginalValueAt(rowNum, i);
Lines 402-414 Link Here
402
        }
410
        }
403
    }
411
    }
404
412
405
    private void generateWhereCondition(DBTable table, StringBuilder sql, int rowNum, DataViewTableUIModel model) {
413
    void generateWhereCondition(DBTable table, StringBuilder sql, int rowNum, DataViewTableUIModel model) {
406
        DBPrimaryKey key = table.getPrimaryKey();
414
        DBPrimaryKey key = table.getPrimaryKey();
407
        boolean keySelected = false;
415
        Set<String> columnsSelected = new HashSet<String>();
408
        boolean and = false;
416
        boolean and = false;
409
        
417
        
410
        List<DBColumn> columns = table.getColumnList();
418
        List<DBColumn> columns = table.getColumnList();
411
419
420
        StringBuilder pkSelect = new StringBuilder();
421
        
412
        if (key != null) {
422
        if (key != null) {
413
            for (String keyName : key.getColumnNames()) {
423
            for (String keyName : key.getColumnNames()) {
414
                for (int i = 0; i < model.getColumnCount(); i++) {
424
                for (int i = 0; i < model.getColumnCount(); i++) {
Lines 417-433 Link Here
417
                    if (columnName.equals(keyName)) {
427
                    if (columnName.equals(keyName)) {
418
                        Object val = model.getOriginalValueAt(rowNum, i);
428
                        Object val = model.getOriginalValueAt(rowNum, i);
419
                        if (val != null) {
429
                        if (val != null) {
420
                            keySelected = true;
430
                            columnsSelected.add(columnName);
421
                            and = addSeparator(and, sql, " AND "); // NOI18N
431
                            and = addSeparator(and, pkSelect, " AND "); // NOI18N
422
                            generateNameValue(dbcol, sql, val);
432
                            generateNameValue(dbcol, pkSelect, val);
423
                            break;
433
                            break;
424
                        }
434
                        }
425
                    }
435
                    }
426
                }
436
                }
427
            }
437
            }
428
        }
438
        }
429
439
        
430
        if (key == null || !keySelected) {
440
        if(key != null && columnsSelected.equals(new HashSet<String>(key.getColumnNames()))) {
441
            sql.append(pkSelect);
442
        } else {
443
            and = false;
431
            for (int i = 0; i < model.getColumnCount(); i++) {
444
            for (int i = 0; i < model.getColumnCount(); i++) {
432
                DBColumn dbcol = columns.get(i);
445
                DBColumn dbcol = columns.get(i);
433
                Object val = model.getOriginalValueAt(rowNum, i);
446
                Object val = model.getOriginalValueAt(rowNum, i);
(-)a/db.dataview/test/unit/data/etc/dbcreate.sql (-1 / +1 lines)
Line 1 Link Here
1
create table if not exists simpletable (tinyintc INT,smallintc INT,varcharc VARCHAR(20),intc INT,bigintc BIGINT,datec DATE,charc CHAR,datetime TIMESTAMP,floatc FLOAT,doublec DOUBLE,doubleprecisionc DOUBLE,CONSTRAINT pk_tinyintc PRIMARY KEY (tinyintc));
1
create table if not exists simpletable (tinyintc INT,smallintc INT,varcharc VARCHAR(20),intc INT,bigintc BIGINT,datec DATE,charc CHAR,datetime TIMESTAMP,floatc FLOAT,doublec DOUBLE,doubleprecisionc DOUBLE,CONSTRAINT pk_tinyintc PRIMARY KEY (tinyintc, smallintc));
(-)a/db.dataview/test/unit/src/org/netbeans/modules/db/dataview/meta/DBPrimaryKeyTest.java (-2 / +3 lines)
Lines 142-148 Link Here
142
        DBPrimaryKey expPK = getDBPrimaryKey();
142
        DBPrimaryKey expPK = getDBPrimaryKey();
143
        expPK.setDisplayName("P_Key");
143
        expPK.setDisplayName("P_Key");
144
        instanceTable.setPrimaryKey(expPK);
144
        instanceTable.setPrimaryKey(expPK);
145
        int expResult = 1;
145
        int expResult = 2;
146
        int result = expPK.getColumnCount();
146
        int result = expPK.getColumnCount();
147
        assertEquals(expResult, result);
147
        assertEquals(expResult, result);
148
    }
148
    }
Lines 154-159 Link Here
154
        DBPrimaryKey instance = getDBPrimaryKey();
154
        DBPrimaryKey instance = getDBPrimaryKey();
155
        List<String> result = instance.getColumnNames();
155
        List<String> result = instance.getColumnNames();
156
        assertEquals("TINYINTC", result.get(0));
156
        assertEquals("TINYINTC", result.get(0));
157
        assertEquals("SMALLINTC", result.get(1));
157
    }
158
    }
158
    
159
    
159
    /**
160
    /**
Lines 161-167 Link Here
161
     */
162
     */
162
    public void testToString() {
163
    public void testToString() {
163
        DBPrimaryKey instance = getDBPrimaryKey();
164
        DBPrimaryKey instance = getDBPrimaryKey();
164
        String expResult = "TINYINTC";
165
        String expResult = "TINYINTC,SMALLINTC";
165
        String result = instance.toString();
166
        String result = instance.toString();
166
        assertEquals(expResult, result);
167
        assertEquals(expResult, result);
167
    }
168
    }
(-)a/db.dataview/test/unit/src/org/netbeans/modules/db/dataview/output/SQLStatementGeneratorTest.java (-12 / +175 lines)
Lines 42-48 Link Here
42
42
43
package org.netbeans.modules.db.dataview.output;
43
package org.netbeans.modules.db.dataview.output;
44
44
45
import java.sql.Connection;
46
import java.sql.ResultSet;
47
import java.sql.ResultSetMetaData;
48
import java.sql.SQLException;
49
import java.sql.Statement;
50
import java.sql.Types;
51
import java.util.ArrayList;
52
import java.util.Arrays;
53
import java.util.Collection;
54
import java.util.List;
55
import static junit.framework.Assert.assertEquals;
56
import org.netbeans.api.db.explorer.DatabaseConnection;
45
import org.netbeans.junit.NbTestCase;
57
import org.netbeans.junit.NbTestCase;
58
import org.netbeans.modules.db.dataview.meta.DBColumn;
59
import org.netbeans.modules.db.dataview.meta.DBMetaDataFactory;
60
import org.netbeans.modules.db.dataview.meta.DBTable;
61
import org.netbeans.modules.db.dataview.util.DBReadWriteHelper;
62
import org.netbeans.modules.db.dataview.util.DBTestUtil;
63
import org.netbeans.modules.db.dataview.util.DbUtil;
64
import org.netbeans.modules.db.dataview.util.TestCaseContext;
46
65
47
/**
66
/**
48
 *
67
 *
Lines 50-59 Link Here
50
 */
69
 */
51
public class SQLStatementGeneratorTest extends NbTestCase {
70
public class SQLStatementGeneratorTest extends NbTestCase {
52
    
71
    
53
//    TestCaseContext context;
72
    TestCaseContext context;
54
//    DatabaseConnection dbconn;
73
    DatabaseConnection dbconn;
55
//    Connection conn;
74
    Connection conn;
56
//    DBTable table;
75
57
    public SQLStatementGeneratorTest(String testName) {
76
    public SQLStatementGeneratorTest(String testName) {
58
        super(testName);
77
        super(testName);
59
    }
78
    }
Lines 66-83 Link Here
66
    @Override
85
    @Override
67
    protected void setUp() throws Exception {
86
    protected void setUp() throws Exception {
68
        super.setUp();
87
        super.setUp();
69
//        context = DbUtil.getContext();
88
        DBTestUtil.suppressSuperfluousLogging();
70
//        dbconn = DbUtil.getDBConnection();
89
        context = DbUtil.getContext();
71
//        conn = DbUtil.getjdbcConnection();
90
        dbconn = DbUtil.getDBConnection();
72
//        DbUtil.createTable();
91
        conn = DbUtil.getjdbcConnection();
92
        DbUtil.createTable();
73
    }
93
    }
74
94
75
    @Override
95
    @Override
76
    protected void tearDown() throws Exception {
96
    protected void tearDown() throws Exception {
77
        super.tearDown();
97
        super.tearDown();
78
//        DbUtil.dropTable();
98
        DbUtil.dropTable();
99
    }
100
    
101
    public void testGenerateWhereConditionWithPK() throws SQLException {
102
        DBMetaDataFactory dbMeta = new DBMetaDataFactory(conn);
103
        Statement s = conn.createStatement();
104
        String sql = "SELECT tinyintc, smallintc,varcharc FROM simpletable";
105
106
        ResultSet rs = s.executeQuery(sql);
107
        Collection<DBTable> tables = dbMeta.generateDBTables(rs, sql, true);
108
109
        DBTable table = tables.iterator().next();
110
        assertEquals(2, table.getPrimaryKey().getColumnCount());
111
112
        SQLStatementGenerator ssg = new SQLStatementGenerator();
113
114
        List<DBColumn> columns = table.getColumnList();
115
116
        DataViewTableUIModel model = new DataViewTableUIModel(
117
                columns.toArray(new DBColumn[0]));
118
119
        ResultSetMetaData rsmd = rs.getMetaData();
120
121
        while (rs.next()) {
122
            Object[] row = new Object[rsmd.getColumnCount()];
123
            for (int i = 0; i < rsmd.getColumnCount(); i++) {
124
                row[i] = DBReadWriteHelper.readResultSet(rs, columns.get(i),
125
                        i + 1);
126
            }
127
            model.addRow(row);
128
        }
129
130
        StringBuilder result = new StringBuilder();
131
        ssg.generateWhereCondition(table, result, 0, model);
132
133
        assertEquals("TINYINTC = -80 AND SMALLINTC = -32766", result.toString());
134
    }
135
    
136
    public void testGenerateWhereConditionWithoutPK() throws SQLException {
137
        DBMetaDataFactory dbMeta = new DBMetaDataFactory(conn);
138
        Statement s = conn.createStatement();
139
        String sql = "SELECT smallintc, varcharc FROM simpletable";
140
        
141
        ResultSet rs = s.executeQuery(sql);
142
        Collection<DBTable> tables = dbMeta.generateDBTables(rs, sql, true);
143
        
144
        DBTable table = tables.iterator().next();
145
        assertEquals(2, table.getPrimaryKey().getColumnCount());
146
        
147
        SQLStatementGenerator ssg = new SQLStatementGenerator();
148
        
149
        List<DBColumn> columns = table.getColumnList();
150
        
151
        DataViewTableUIModel model = new DataViewTableUIModel(
152
                columns.toArray(new DBColumn[0]));
153
        
154
        ResultSetMetaData rsmd = rs.getMetaData();
155
        
156
        while(rs.next()) {
157
            Object[] row = new Object[rsmd.getColumnCount()];
158
            for(int i = 0; i < rsmd.getColumnCount(); i++) {
159
                row[i] = DBReadWriteHelper.readResultSet(rs, columns.get(i), i + 1);
160
            }
161
            model.addRow(row);
162
        }
163
        
164
        StringBuilder result = new StringBuilder();
165
        ssg.generateWhereCondition(table, result, 0, model);
166
        
167
        assertEquals("SMALLINTC = -32766 AND VARCHARC = 'ala'", result.toString());
79
    }
168
    }
80
169
170
    public void testGenerateWhereConditionWithPK2() throws SQLException {
171
        DBMetaDataFactory dbMeta = new DBMetaDataFactory(conn);
172
        Statement s = conn.createStatement();
173
        String sql = "SELECT tinyintc, smallintc,varcharc FROM simpletable";
174
175
        ResultSet rs = s.executeQuery(sql);
176
        Collection<DBTable> tables = dbMeta.generateDBTables(rs, sql, true);
177
178
        DBTable table = tables.iterator().next();
179
        assertEquals(2, table.getPrimaryKey().getColumnCount());
180
181
        SQLStatementGenerator ssg = new SQLStatementGenerator();
182
183
        List<DBColumn> columns = table.getColumnList();
184
185
        DataViewTableUIModel model = new DataViewTableUIModel(
186
                columns.toArray(new DBColumn[0]));
187
188
        ResultSetMetaData rsmd = rs.getMetaData();
189
190
        while (rs.next()) {
191
            Object[] row = new Object[rsmd.getColumnCount()];
192
            for (int i = 0; i < rsmd.getColumnCount(); i++) {
193
                row[i] = DBReadWriteHelper.readResultSet(rs, columns.get(i),
194
                        i + 1);
195
            }
196
            model.addRow(row);
197
        }
198
199
        StringBuilder resultSQL = new StringBuilder();
200
        List<Integer> resultTypes = new ArrayList<Integer>();
201
        List<Object> resultObject = new ArrayList<Object>();
202
        ssg.generateWhereCondition(table, resultSQL, resultTypes, resultObject, 0, model);
203
204
        assertEquals("\"TINYINTC\" = ?  AND \"SMALLINTC\" = ? ", resultSQL.toString());
205
        assertEquals(Arrays.asList(new Integer[] {Types.INTEGER, Types.INTEGER}), resultTypes);
206
        assertEquals(Arrays.asList(new Object[] {-80, -32766}), resultObject);
207
    }
208
    
209
    public void testGenerateWhereConditionWidthoutPK2() throws SQLException {
210
        DBMetaDataFactory dbMeta = new DBMetaDataFactory(conn);
211
        Statement s = conn.createStatement();
212
        String sql = "SELECT smallintc, varcharc FROM simpletable";
213
        
214
        ResultSet rs = s.executeQuery(sql);
215
        Collection<DBTable> tables = dbMeta.generateDBTables(rs, sql, true);
216
        
217
        DBTable table = tables.iterator().next();
218
        assertEquals(2, table.getPrimaryKey().getColumnCount());
219
        
220
        SQLStatementGenerator ssg = new SQLStatementGenerator();
221
        
222
        List<DBColumn> columns = table.getColumnList();
223
        
224
        DataViewTableUIModel model = new DataViewTableUIModel(
225
                columns.toArray(new DBColumn[0]));
226
        
227
        ResultSetMetaData rsmd = rs.getMetaData();
228
        
229
        while(rs.next()) {
230
            Object[] row = new Object[rsmd.getColumnCount()];
231
            for(int i = 0; i < rsmd.getColumnCount(); i++) {
232
                row[i] = DBReadWriteHelper.readResultSet(rs, columns.get(i), i + 1);
233
            }
234
            model.addRow(row);
235
        }
236
        
237
        StringBuilder resultSQL = new StringBuilder();
238
        List<Integer> resultTypes = new ArrayList<Integer>();
239
        List<Object> resultObject = new ArrayList<Object>();
240
        ssg.generateWhereCondition(table, resultSQL, resultTypes, resultObject, 0, model);
241
        
242
        assertEquals("\"SMALLINTC\" = ?  AND \"VARCHARC\" = ? ", resultSQL.toString());
243
        assertEquals(Arrays.asList(new Integer[] {Types.INTEGER, Types.VARCHAR}), resultTypes);
244
        assertEquals(Arrays.asList(new Object[] {-32766, "ala"}), resultObject);
245
    }
246
    
81
//        protected void createTable(){
247
//        protected void createTable(){
82
//        try {
248
//        try {
83
//            //Quoter qt = SQLIdentifiers.createQuoter(dbmd);
249
//            //Quoter qt = SQLIdentifiers.createQuoter(dbmd);
Lines 185-191 Link Here
185
//        // TODO review the generated test code and remove the default call to fail.
351
//        // TODO review the generated test code and remove the default call to fail.
186
//        fail("The test case is a prototype.");
352
//        fail("The test case is a prototype.");
187
//    }
353
//    }
188
    public void testToDo(){
189
        assertTrue("To Do", true);
190
    }
191
}
354
}

Return to bug 227588