001/* 002 * Copyright (c) 2003-2010 The Regents of the University of California. 003 * All rights reserved. 004 * 005 * '$Author: welker $' 006 * '$Date: 2010-05-06 05:21:26 +0000 (Thu, 06 May 2010) $' 007 * '$Revision: 24234 $' 008 * 009 * Permission is hereby granted, without written agreement and without 010 * license or royalty fees, to use, copy, modify, and distribute this 011 * software and its documentation for any purpose, provided that the above 012 * copyright notice and the following two paragraphs appear in all copies 013 * of this software. 014 * 015 * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY 016 * FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES 017 * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF 018 * THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF 019 * SUCH DAMAGE. 020 * 021 * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, 022 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 023 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE 024 * PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE UNIVERSITY OF 025 * CALIFORNIA HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, 026 * ENHANCEMENTS, OR MODIFICATIONS. 027 * 028 */ 029 030package org.ecoinformatics.seek.querybuilder; 031 032import java.awt.BorderLayout; 033import java.awt.Component; 034import java.awt.Dimension; 035import java.awt.event.ActionEvent; 036import java.awt.event.MouseAdapter; 037import java.awt.event.MouseEvent; 038import java.awt.event.MouseListener; 039import java.util.Enumeration; 040import java.util.Hashtable; 041import java.util.Vector; 042 043import javax.swing.AbstractAction; 044import javax.swing.ButtonGroup; 045import javax.swing.DefaultListModel; 046import javax.swing.JButton; 047import javax.swing.JComponent; 048import javax.swing.JDesktopPane; 049import javax.swing.JLabel; 050import javax.swing.JList; 051import javax.swing.JPanel; 052import javax.swing.JRadioButton; 053import javax.swing.JScrollPane; 054import javax.swing.JSplitPane; 055import javax.swing.ListSelectionModel; 056import javax.swing.event.ListSelectionEvent; 057import javax.swing.event.ListSelectionListener; 058import javax.swing.event.TableModelListener; 059 060import org.kepler.objectmanager.data.db.DSSchemaIFace; 061import org.kepler.objectmanager.data.db.DSTableFieldIFace; 062import org.kepler.objectmanager.data.db.DSTableIFace; 063 064/** 065 * This class shows a split view with a set of table schemas as draggable tables 066 * in the upper pane. The the "from" clause of the select can be created by 067 * dragging fields from one table to the next to form the "join" relationships. 068 * And a two tab control in the lower pane. The Select pane enables the user to 069 * indicate which fields will be displayed and what the conditions will be for 070 * each of the fields. 071 * 072 * The Where pane enables the user to specify a complex conditional. 073 */ 074public class QBSplitPaneIntermediate extends JPanel implements 075 ListSelectionListener, QBBuilderInterface { 076 protected JSplitPane mSplitPane = null; 077 protected DSSchemaIFace mSchema = null; 078 protected DBTableDesktopPane mDesktop = null; 079 protected DBTableJoin mTableJoins = null; 080 protected JButton mAddBtn = null; 081 protected JList mTableList = null; 082 protected TableModelListener mTableModelListener = null; 083 084 protected Hashtable mModelHash = null; 085 protected Hashtable mTablesViewHash = null; 086 087 protected DBSelectTableUIStd mTableView = null; 088 protected DBSelectTableModelStd mTableModel = null; 089 090 protected JRadioButton mAllRadio = null; 091 protected JRadioButton mAnyRadio = null; 092 093 /** 094 * QBSplitPaneIntermediate Constructor 095 * 096 * @param aSchema 097 * the schema 098 * @param aListener 099 * a listener of changes to the overall model 100 */ 101 public QBSplitPaneIntermediate(DSSchemaIFace aSchema, 102 TableModelListener aListener) { 103 mSchema = aSchema; 104 105 setLayout(new BorderLayout()); 106 107 JComponent upperPanel = createUpperPanel(aSchema, aListener); 108 JComponent lowerPanel = createLowerPanel(mDesktop); 109 110 mSplitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, upperPanel, 111 lowerPanel); 112 mSplitPane.setContinuousLayout(true); 113 mSplitPane.setOneTouchExpandable(true); 114 mSplitPane.setDividerLocation(230); 115 116 add(mSplitPane, BorderLayout.CENTER); 117 118 // Now that the Top and Bottom Panes have been created 119 // It is time to hook up the listeners so the tables in the top pane 120 // can listen for changes in the bottom pane 121 Vector tables = mDesktop.getTables(); 122 for (int i = 0; i < tables.size(); i++) { 123 mTableModel.addTableModelListener((TableModelListener) tables 124 .elementAt(i)); 125 mTableView.addFieldChangeListener(mDesktop); 126 } 127 128 } 129 130 /** 131 * Sets the Model Listener appropriately 132 * 133 * @param aTblModelListener 134 * a listener 135 */ 136 public void setTableModelListener(TableModelListener aTblModelListener) { 137 mTableModelListener = aTblModelListener; 138 mTableModel.addTableModelListener(aTblModelListener); 139 } 140 141 /** 142 * Do Clean up 143 */ 144 public void shutdown() { 145 mTableList.removeListSelectionListener(this); 146 mTableView.removeFieldChangeListener(mDesktop); 147 mTableModel.removeTableModelListener(mTableModelListener); 148 mDesktop.setTableModelListener(null); 149 150 mTableView.setModel(null); 151 Vector tables = mDesktop.getTables(); 152 if (tables != null && tables.size() > 0) { 153 for (Enumeration et = tables.elements(); et.hasMoreElements();) { 154 mTableModel.removeTableModelListener((TableModelListener) et 155 .nextElement()); 156 } 157 } 158 // Clean up 159 mSplitPane = null; 160 mSchema = null; 161 mDesktop = null; 162 mTableJoins = null; 163 mTableView = null; 164 mTableModel = null; 165 mAddBtn = null; 166 mTableList = null; 167 mTableModelListener = null; 168 } 169 170 /** 171 * Return Schema 172 * 173 * @return the schema 174 */ 175 public DSSchemaIFace getSchema() { 176 return mDesktop; 177 } 178 179 /** 180 * Creates the DesktopPane that contains all the tables with "links" or 181 * joins. 182 * 183 * @param aSchema 184 * the schema 185 * @param aListener 186 * the listener for the overall model changes 187 * @return the component representing the upper pane 188 */ 189 public JComponent createUpperPanel(DSSchemaIFace aSchema, 190 TableModelListener aListener) { 191 mDesktop = new DBTableDesktopPane(); 192 mDesktop.setSchema(mSchema); 193 mDesktop.setTableModelListener(aListener); 194 195 // Create the mDesktop pane 196 mTableJoins = mDesktop.getTableJoins(); 197 198 JScrollPane desktopScroller = new JScrollPane(); 199 desktopScroller.getViewport().add(mDesktop); 200 201 DefaultListModel listModel = new DefaultListModel(); 202 Vector tables = mSchema.getTables(); 203 if (tables != null && tables.size() > 0) { 204 for (Enumeration et = tables.elements(); et.hasMoreElements();) { 205 DSTableIFace table = (DSTableIFace) et.nextElement(); 206 listModel.addElement(table.getName()); 207 } 208 } 209 210 JPanel rightSidePanel = new JPanel(new BorderLayout()); 211 mTableList = new JList(listModel); 212 mTableList.addListSelectionListener(this); 213 mTableList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 214 215 MouseListener mouseListener = new MouseAdapter() { 216 public void mouseClicked(MouseEvent e) { 217 if (e.getClickCount() == 2) { 218 mDesktop.addTableToWorkspace((String) mTableList 219 .getSelectedValue()); 220 } 221 } 222 }; 223 mTableList.addMouseListener(mouseListener); 224 225 JScrollPane scroller = new JScrollPane(); 226 scroller.getViewport().add(mTableList); 227 228 rightSidePanel.add(scroller, BorderLayout.CENTER); 229 rightSidePanel.add(new JLabel("Available Tables:"), BorderLayout.NORTH); 230 231 mAddBtn = new JButton("<- Add"); 232 rightSidePanel.add(mAddBtn, BorderLayout.SOUTH); 233 234 valueChanged(null); // enables/disables the add button 235 236 JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, 237 desktopScroller, rightSidePanel); 238 splitPane.setContinuousLayout(true); 239 splitPane.setOneTouchExpandable(true); 240 241 mAddBtn.addActionListener(new AbstractAction() { 242 public void actionPerformed(ActionEvent e) { 243 mDesktop.addTableToWorkspace((String) mTableList 244 .getSelectedValue()); 245 } 246 }); 247 248 return splitPane; 249 } 250 251 /** 252 * Creates the "Select" panel for discribing what fields will have their 253 * values displayed 254 * 255 * @param aSchema 256 * the schema 257 * @return the component representing the select pane 258 */ 259 /* 260 * public JPanel createSelectForDisplayPanel(DSSchemaIFace aSchema) { JPanel 261 * panel = new JPanel(new BorderLayout()); 262 * 263 * // Create table mode and view for the DB Tables mTableView = new 264 * DBSelectTableUIAdv(); mTableModel = new DBSelectTableModelAdv(aSchema); 265 * mTableView.setColumnSelectionAllowed(false); 266 * mTableView.setRowSelectionAllowed(true); 267 * mTableView.setCellSelectionEnabled(true); 268 * 269 * Vector tables = mDesktop.getTables(); mTableView.setModel(mTableModel); 270 * for (int i=0;i<tables.size();i++) { 271 * mTableModel.addTableModelListener((TableModelListener 272 * )tables.elementAt(i)); } mTableView.installEditors(); 273 * 274 * JScrollPane scrollpane = new JScrollPane(mTableView); 275 * 276 * panel.add(scrollpane, BorderLayout.CENTER); return panel; } 277 */ 278 279 /** 280 * Creates the radio buttons 281 * 282 * @return the container (panel) 283 */ 284 protected JPanel createRadioButtons() { 285 ButtonGroup group = new ButtonGroup(); 286 287 // Text Radio Buttons 288 JPanel p2 = QBSplitPaneStandard.createHorizontalPanel(true); 289 290 mAllRadio = (JRadioButton) p2.add(new JRadioButton( 291 "Meets All the Conditions Below")); 292 group.add(mAllRadio); 293 mAllRadio.setSelected(true); 294 295 mAnyRadio = (JRadioButton) p2.add(new JRadioButton( 296 "Meets Any of the Conditions Below")); 297 group.add(mAnyRadio); 298 299 return p2; 300 } 301 302 /** 303 * Creates the lower panel that contains the tabs "Select" and "Where" 304 * 305 * @param aSchema 306 * the schema 307 * @return the component representing the lower pane 308 */ 309 public JComponent createLowerPanel(DSSchemaIFace aSchema) { 310 mModelHash = new Hashtable(); 311 Vector tables = aSchema.getTables(); 312 if (tables != null && tables.size() > 0) { 313 Object[] tblArray = tables.toArray(); 314 QuickSort.doSort(tblArray, 0, tblArray.length - 1); 315 316 for (int i = 0; i < tblArray.length; i++) { 317 DSTableIFace table = (DSTableIFace) tblArray[i]; 318 DBSelectTableOverviewModel model = new DBSelectTableOverviewModel( 319 table); 320 mModelHash.put(table.getName(), model); 321 } 322 } 323 324 mTableView = new DBSelectTableUIStd(); // referenced in createLowerPanel 325 // and createUpperPanel 326 // Create table mode and view for the DB Tables 327 mTableModel = new DBSelectTableModelStd(aSchema, mModelHash); 328 mTableView.setColumnSelectionAllowed(false); 329 mTableView.setRowSelectionAllowed(true); 330 mTableView.setCellSelectionEnabled(true); 331 332 mTableView.setModel(mTableModel); 333 mTableView.installEditors(); 334 335 JPanel noviceMainPanel = new JPanel(new BorderLayout()); 336 noviceMainPanel.add(createRadioButtons(), BorderLayout.NORTH); 337 338 JScrollPane scrollpane = new JScrollPane(mTableView); 339 scrollpane.setPreferredSize(new Dimension(700, 300)); 340 noviceMainPanel.add(scrollpane, BorderLayout.CENTER); 341 342 return noviceMainPanel; 343 } 344 345 /** 346 * (future work) 347 * 348 * @param aList 349 * @param aTableName 350 * */ 351 /* 352 * private DBJoinPrcTable getTable(Vector aList, String aTableName) { for 353 * (Enumeration et = aList.elements(); et.hasMoreElements();) { 354 * DBJoinPrcTable item = (DBJoinPrcTable)et.nextElement(); if 355 * (item.getTable().getName().equals(aTableName)) { return item; } } return 356 * null; } 357 */ 358 359 /** 360 * (future work) Adds a "join" condition 361 * 362 * @param aList 363 * @param aField 364 * @param aJoinItem 365 */ 366 /* 367 * private void addJoinToTables(Vector aList, DBTableField aField, 368 * DBTableJoinItem aJoinItem) { DBJoinPrcTable item = getTable(aList, 369 * aField.getTable().getName()); if (item == null) { item = new 370 * DBJoinPrcTable(aField.getTable()); aList.add(item); } 371 * item.add(aJoinItem); } 372 */ 373 374 /** 375 * Makes the entire Desktop object repaint itself 376 * 377 */ 378 protected void refresh() { 379 // mDesktop.refresh(); 380 if (mDesktop != null) 381 mDesktop.makeDirty(); 382 } 383 384 /** 385 * Returns whether their will be data loss if this query is converted to a 386 * "standard" query meaning we have defined some "where" items, but have not 387 * created any "display" items 388 * 389 * @return true if possible data loss 390 */ 391 public boolean possibleDataLoss() { 392 boolean atLeastOneForDisplay = false; 393 for (int i = 0; i < mTableModel.getRowCount(); i++) { 394 DBSelectTableModelItem item = (DBSelectTableModelItem) mTableModel 395 .getFieldForRow(i); 396 if (item.isDisplayed()) { 397 atLeastOneForDisplay = true; 398 } 399 } 400 401 return mTableModel.getRowCount() > 1 && !atLeastOneForDisplay; 402 } 403 404 /** 405 * Fill the hastable with the table names 406 * 407 * @param aWhereObj 408 * the where object 409 * @param aHashTable 410 * the hastable 411 */ 412 protected void fillHashWithTableNamesForWhere(DBWhereIFace aWhereObj, 413 Hashtable aHashTable) { 414 if (aWhereObj == null) 415 return; 416 417 if (aWhereObj instanceof DBWhereCondition) { 418 String tblName = ((DBWhereCondition) aWhereObj).getTableName(); 419 if (tblName.length() > 0) 420 aHashTable.put(tblName, tblName); 421 422 } else { 423 DBWhereOperator whereOper = (DBWhereOperator) aWhereObj; 424 for (Enumeration e = whereOper.getEnumeration(); e 425 .hasMoreElements();) { 426 fillHashWithTableNamesForWhere((DBWhereIFace) e.nextElement(), 427 aHashTable); 428 } 429 } 430 } 431 432 // --------------------------------------------------- 433 // -- ListSelectionListener 434 // --------------------------------------------------- 435 public void valueChanged(ListSelectionEvent e) { 436 mAddBtn.setEnabled(mTableList.getSelectedIndex() != -1); 437 } 438 439 // --------------------------------------------------- 440 // -- QBBuilderInterface 441 // --------------------------------------------------- 442 443 /** 444 * 445 * @return returns the "type" of builder it is as defined by the constants 446 * in this interface 447 */ 448 public int getType() { 449 return QBBuilderInterface.INTERMEDIATE; 450 } 451 452 /** 453 * A textual name for this builder 454 * 455 * @return string of the name 456 */ 457 public String getName() { 458 return "Intermediate"; 459 } 460 461 /** 462 * This checks to see if this type of builder can convert the internal SQL 463 * to a more complex or less complex form. 464 * 465 * This is typically called when switching from a more complex builder to a 466 * less complex builder 467 * 468 * @param aBldr 469 * The "receiving" builder, in other words can this builder 470 * convert the SQL to the new builder 471 * @return true if it can convert it, false if it can not 472 */ 473 public boolean canConvertTo(QBBuilderInterface aBldr) { 474 switch (aBldr.getType()) { 475 case QBBuilderInterface.STANDARD: 476 return mTableJoins.mJoinItems.size() == 0; 477 478 case QBBuilderInterface.INTERMEDIATE: 479 return true; 480 481 case QBBuilderInterface.ADVANCED: 482 return true; 483 } 484 485 return false; 486 } 487 488 /** 489 * Create SQL string 490 */ 491 public String createSQL() { 492 Hashtable tableNames = new Hashtable(); 493 StringBuffer strBuf = new StringBuffer("SELECT "); 494 DBSelectTableModelStd model = (DBSelectTableModelStd) mTableView 495 .getModel(); 496 int displayCnt = 0; 497 for (int i = 0; i < model.getRowCount(); i++) { 498 DBSelectTableModelItem item = (DBSelectTableModelItem) model 499 .getFieldForRow(i); 500 if (item.isDisplayed()) { 501 tableNames.put(item.getTableName(), item.getTableName()); 502 displayCnt++; 503 } 504 } 505 if (displayCnt == 0) 506 return "No valid SQL to generate"; 507 508 displayCnt = 0; 509 for (int i = 0; i < model.getRowCount(); i++) { 510 DBSelectTableModelItem item = (DBSelectTableModelItem) model 511 .getFieldForRow(i); 512 if (item.isDisplayed()) { 513 if (displayCnt > 0) { 514 strBuf.append(", "); 515 } 516 displayCnt++; 517 strBuf.append(DBUIUtils.getFullFieldName(item.getTableName(), 518 item.getName())); 519 tableNames.put(item.getTableName(), item.getTableName()); 520 } 521 } 522 strBuf.append(" FROM "); 523 524 StringBuffer whereStr = new StringBuffer(); 525 Vector joins = mTableJoins.getJoins(); 526 int cnt = 0; 527 for (Enumeration et = joins.elements(); et.hasMoreElements();) { 528 if (cnt > 0) { 529 whereStr.append(" AND "); 530 } 531 cnt++; 532 DBTableJoinItem joinItem = (DBTableJoinItem) et.nextElement(); 533 whereStr.append(DBUIUtils.getFullFieldName(joinItem.getItemLeft())); 534 whereStr.append(" = "); 535 whereStr 536 .append(DBUIUtils.getFullFieldName(joinItem.getItemRight())); 537 String tblName = joinItem.getItemLeft().getTable().getName(); 538 tableNames.put(tblName, tblName); 539 tblName = joinItem.getItemRight().getTable().getName(); 540 tableNames.put(tblName, tblName); 541 } 542 543 displayCnt = 0; 544 for (Enumeration et = tableNames.elements(); et.hasMoreElements();) { 545 String tableName = (String) et.nextElement(); 546 if (tableName.indexOf(' ') != -1) { 547 tableName = "[" + tableName + "]"; 548 } 549 if (displayCnt > 0) { 550 strBuf.append(", "); 551 } 552 displayCnt++; 553 strBuf.append(tableName); 554 } 555 556 /* 557 * strBuf.append(" WHERE "); strBuf.append(whereStr); String 558 * wherePanelStr = mWherePanel.generateWhereSQL(true); String noSpaces = 559 * wherePanelStr.trim(); if (noSpaces.length() > 0) { 560 * strBuf.append(" AND "); strBuf.append(wherePanelStr); } 561 */ 562 563 return strBuf.toString(); 564 565 } 566 567 /** 568 * Build UI from the Query Definition Object 569 * 570 * @param aQueryDef 571 * the query 572 */ 573 public int buildFromQueryDef(DBQueryDef aQueryDef) { 574 if (aQueryDef == null) 575 return DBQueryDef.BUILD_ERROR; 576 577 mDesktop.clearTables(); 578 for (Enumeration e = aQueryDef.getTables().elements(); e 579 .hasMoreElements();) { 580 mDesktop.addTableToWorkspace((DBQueryDefTable) e.nextElement()); 581 } 582 583 // clear and build joins 584 mTableJoins.clear(); 585 if (aQueryDef.getJoins() != null) { 586 for (Enumeration e = aQueryDef.getJoins().elements(); e 587 .hasMoreElements();) { 588 DBSelectTableModelItem left = (DBSelectTableModelItem) e 589 .nextElement(); 590 DBSelectTableModelItem right = (DBSelectTableModelItem) e 591 .nextElement(); 592 mTableJoins.addJoin(left, right); 593 } 594 } 595 596 StringBuffer operStr = new StringBuffer(); 597 int status = mTableModel.buildFromQueryDef(aQueryDef, operStr, true); 598 if (operStr.toString().equals(DBWhereOperator.AND_OPER)) { 599 mAllRadio.setSelected(true); 600 } else { 601 mAnyRadio.setSelected(true); 602 } 603 mTableModel.fireTableModelChanged(); 604 repaint(); 605 return status; 606 607 /* 608 * if (aQueryDef != null) { 609 * 610 * mTableModel.buildFromQueryDef(aQueryDef); 611 * 612 * mDesktop.clearTables(); for (Enumeration e = 613 * aQueryDef.getTables().elements(); e.hasMoreElements();) { 614 * mDesktop.addTableToWorkspace((DBQueryDefTable)e.nextElement()); } 615 * 616 * // clear and build joins mTableJoins.clear(); if 617 * (aQueryDef.getJoins() != null) { for (Enumeration e = 618 * aQueryDef.getJoins().elements(); e.hasMoreElements();) { 619 * DBSelectTableModelItem left = 620 * (DBSelectTableModelItem)e.nextElement(); DBSelectTableModelItem right 621 * = (DBSelectTableModelItem)e.nextElement(); mTableJoins.addJoin(left, 622 * right); } } 623 * 624 * refresh(); return DBQueryDef.BUILD_OK; } return 625 * DBQueryDef.BUILD_ERROR; 626 */ 627 } 628 629 /** 630 * Fill the QueryDef from the Model 631 * 632 * @param aQueryDef 633 * the query 634 */ 635 public void fillQueryDef(DBQueryDef aQueryDef) { 636 if (aQueryDef == null) 637 return; 638 639 Vector tables = new Vector(); 640 641 // Collect which items are being displayed and which ones have criteria 642 Hashtable tableNameHash = new Hashtable(); 643 644 Component tableFrames[] = mDesktop 645 .getComponentsInLayer(JDesktopPane.DEFAULT_LAYER.intValue()); 646 for (int i = 0; i < tableFrames.length; i++) { 647 if (tableFrames[i] instanceof DBTableFrame) { 648 DBTableFrame tbl = (DBTableFrame) tableFrames[i]; 649 aQueryDef.addTable(tbl.getId(), tbl.getName(), tbl 650 .getLocation().x, tbl.getLocation().y); 651 // remove a duplicate table name 652 tableNameHash.remove(tbl.getName()); 653 } 654 } 655 656 // Add any table names that where used in a where clause but not in the 657 // joins 658 // for (Enumeration e = tableNameHash.elements(); e.hasMoreElements();) 659 // { 660 // aQueryDef.addTable((String) e.nextElement()); 661 // } 662 663 if (mTableJoins.getJoins().size() > 0) { 664 Vector joins = new Vector(); 665 for (Enumeration e = mTableJoins.getJoins().elements(); e 666 .hasMoreElements();) { 667 DBTableJoinItem joinItem = (DBTableJoinItem) e.nextElement(); 668 DBSelectTableModelItem item = new DBSelectTableModelItem(); 669 item.setTableName(joinItem.getItemLeft().getTable().getName()); 670 item.setName(joinItem.getItemLeft().getName()); 671 item.setTableId(joinItem.getItemLeft().getTable().getId()); 672 joins.add(item); 673 674 item = new DBSelectTableModelItem(); 675 item.setTableName(joinItem.getItemRight().getTable().getName()); 676 item.setName(joinItem.getItemRight().getName()); 677 item.setTableId(joinItem.getItemRight().getTable().getId()); 678 joins.add(item); 679 } 680 if (joins.size() > 0) { 681 aQueryDef.setJoins(joins); 682 } 683 aQueryDef.setIsAdv(true); 684 } else { 685 aQueryDef.setIsAdv(false); 686 } 687 688 Vector itemsDisplayed = new Vector(); 689 Vector itemsWithCriteria = new Vector(); 690 for (int i = 0; i < mTableModel.getRowCount(); i++) { 691 DBSelectTableModelItem item = mTableModel.getFieldForRow(i); 692 if (item.getTableName().length() > 0 && item.getName().length() > 0) { 693 tableNameHash.put(item.getTableName(), item.getTableName()); 694 if (item.isDisplayed()) { 695 itemsDisplayed.add(new DBSelectTableModelItem(item)); 696 } 697 if (item.getCriteria().length() > 0) { 698 itemsWithCriteria.add(new DBSelectTableModelItem(item)); 699 } 700 } 701 } 702 703 // Add each item in the display vector to the QueryDef selects 704 for (Enumeration et = itemsDisplayed.elements(); et.hasMoreElements();) { 705 aQueryDef.addSelectItem((DBSelectTableModelItem) et.nextElement()); 706 } 707 708 // Now create the where object from the items with criteria 709 boolean isSingle = itemsWithCriteria.size() == 1; 710 if (itemsWithCriteria.size() > 0) { 711 if (mAllRadio.isSelected()) { 712 Vector joins = new Vector(); 713 // loop thru all the items and see if any are joins 714 for (Enumeration et = itemsWithCriteria.elements(); et 715 .hasMoreElements();) { 716 DBSelectTableModelItem item = (DBSelectTableModelItem) et 717 .nextElement(); 718 String oper = item.getOperator(); 719 if (oper != null 720 && oper 721 .equals(DBSelectTableUIStd.OPERS_TXT[DBSelectTableUIStd.EQUALS_INX])) { 722 String criteria = item.getCriteria(); 723 StringBuffer tableName = new StringBuffer(); 724 DSTableFieldIFace rightFld = DBUIUtils 725 .isTableFieldName(mSchema, criteria, tableName); 726 DSTableFieldIFace leftFld = DBUIUtils.getFieldByName( 727 mSchema, item.getTableName(), item.getName()); // not 728 // really 729 // needed 730 731 if (rightFld != null) { 732 DBSelectTableModelItem leftItem = new DBSelectTableModelItem( 733 item.getTableName(), item.getName(), 734 leftFld.getDataType(), false, "", "", 735 leftFld.getMissingValueCode()); 736 DBSelectTableModelItem rightItem = new DBSelectTableModelItem( 737 tableName.toString(), rightFld.getName(), 738 rightFld.getDataType(), false, "", "", 739 rightFld.getMissingValueCode()); 740 joins.add(leftItem); 741 joins.add(rightItem); 742 item.setName(null); 743 tableNameHash.put(tableName.toString(), tableName 744 .toString()); 745 } 746 } 747 } 748 if (joins.size() > 0) { 749 aQueryDef.setJoins(joins); 750 } 751 } 752 753 // Add each table name that used 754 for (Enumeration et = tableNameHash.elements(); et 755 .hasMoreElements();) { 756 aQueryDef.addTable((String) et.nextElement()); 757 } 758 DBWhereOperator oper = null; 759 if (!isSingle) { 760 oper = new DBWhereOperator(null, false); 761 oper 762 .setOperator(mAllRadio.isSelected() ? DBWhereOperator.AND_OPER 763 : DBWhereOperator.OR_OPER); 764 } 765 766 boolean itemWasAdded = false; 767 DBWhereCondition cond = null; 768 DBWhereIFace after = null; 769 for (Enumeration et = itemsWithCriteria.elements(); et 770 .hasMoreElements();) { 771 DBSelectTableModelItem item = (DBSelectTableModelItem) et 772 .nextElement(); 773 // skip any item with a null name because it was already used 774 if (item.getName() != null) { 775 cond = new DBWhereCondition(oper, item.getTableName(), item 776 .getName(), item.getDataType()); 777 cond.setOperator(item.getOperator()); 778 cond.setCriteria(item.getCriteria()); 779 if (oper != null) { 780 oper.addAfter(cond, after); 781 itemWasAdded = true; 782 } 783 after = cond; 784 } 785 } 786 if (isSingle) { 787 if (cond != null) { 788 aQueryDef.setWhere((DBWhereIFace) cond); 789 } 790 } else if (oper != null && itemWasAdded) { 791 aQueryDef.setWhere((DBWhereIFace) oper); 792 } 793 } 794 } 795}