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.Color; 034import java.awt.Dimension; 035import java.util.Enumeration; 036import java.util.Hashtable; 037import java.util.Vector; 038 039import javax.swing.Action; 040import javax.swing.Box; 041import javax.swing.BoxLayout; 042import javax.swing.ButtonGroup; 043import javax.swing.JComboBox; 044import javax.swing.JComponent; 045import javax.swing.JLabel; 046import javax.swing.JList; 047import javax.swing.JPanel; 048import javax.swing.JRadioButton; 049import javax.swing.JScrollPane; 050import javax.swing.JSplitPane; 051import javax.swing.border.Border; 052import javax.swing.border.CompoundBorder; 053import javax.swing.border.EmptyBorder; 054import javax.swing.border.SoftBevelBorder; 055import javax.swing.event.ListSelectionEvent; 056import javax.swing.event.ListSelectionListener; 057import javax.swing.event.TableModelListener; 058 059import org.kepler.objectmanager.data.DataType; 060import org.kepler.objectmanager.data.db.DSSchemaIFace; 061import org.kepler.objectmanager.data.db.DSTableFieldIFace; 062import org.kepler.objectmanager.data.db.DSTableIFace; 063 064//import com.sun.jdi.connect.Connector.SelectedArgument; 065 066//import Formulate.DBSchemaFieldNode; 067 068/** 069 * This class shows a split view with a set of table schemas showing via tabs in 070 * the upper pane. And a two tab control in the lower pane. The Select pane 071 * enables the user to indicate which fields will be displayed and what the 072 * conditions will be for each of the fields. 073 * 074 * The Where pane enables 075 * 076 * @author Rod Spears 077 */ 078public class QBSplitPaneStandard extends JPanel implements 079 ListSelectionListener, QBBuilderInterface { 080 private static final int NUM_TABLE_THRESOLD = 3; 081 082 protected JSplitPane mSplitPane = null; 083 protected DSSchemaIFace mSchema = null; 084 085 protected Hashtable mModelHash; 086 protected Hashtable mTablesViewHash; 087 088 protected DBSelectTableUIStd mTableView; 089 protected DBSelectTableModelStd mTableModel; 090 protected DBSelectTableOverviewModel mModel; 091 protected DBSelectTableOverviewTable mSubTableView; 092 protected JScrollPane mTableSchemaPane; 093 protected JRadioButton mAllRadio; 094 protected JRadioButton mAnyRadio; 095 protected JList mTableList; 096 097 protected JSplitPane mUpperSplitPane; 098 protected JPanel mUpperPanel; 099 protected JPanel mSimulatedListPanel; 100 101 protected JPanel mSimulatedListList; 102 protected Action mSimulatedListAction; 103 protected Vector mCheckboxes; 104 105 protected TableModelListener mTableModelListener = null; 106 107 /** 108 * QBSplitPaneBase Constructor 109 */ 110 public QBSplitPaneStandard(DSSchemaIFace aSchema) { 111 mSchema = aSchema; 112 113 setLayout(new BorderLayout()); 114 115 mSplitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, 116 createUpperPanel(aSchema), createLowerPanel(aSchema)); 117 mSplitPane.setContinuousLayout(true); 118 // mSplitPane.setOneTouchExpandable(true); 119 mSplitPane.setDividerLocation(230); 120 121 add(mSplitPane, BorderLayout.CENTER); 122 } 123 124 /** 125 * Return Schema 126 */ 127 public DSSchemaIFace getSchema() { 128 return mSchema; 129 } 130 131 /** 132 * Method to get selected table view 133 * 134 * */ 135 public DBSelectTableUIBase getSelectedTableView() { 136 return mTableView; 137 } 138 139 /** 140 * Method to get selected table view's model 141 * 142 * */ 143 public DBSelectTableOverviewModel getSelectedOverTableViewModel() { 144 return mModel; 145 } 146 147 /** 148 * Method to set selected table Views's model 149 */ 150 public void setSelectedOverViewModel(DBSelectTableOverviewModel mModel) { 151 this.mModel = mModel; 152 } 153 154 /** 155 * Method to get model hash 156 */ 157 public Hashtable getModelHashtable() { 158 return mModelHash; 159 } 160 161 /** 162 * Sets the Model Listener appropriately 163 * 164 * @param aTblModelListener 165 */ 166 public void setTableModelListener(TableModelListener aTblModelListener) { 167 mTableModelListener = aTblModelListener; 168 mTableModel.addTableModelListener(aTblModelListener); 169 } 170 171 /** 172 * Create the upper panel 173 * 174 * @param aSchema 175 * the schema 176 * @return the UI component 177 */ 178 public JComponent createUpperPanel(DSSchemaIFace aSchema) { 179 mModelHash = new Hashtable(); 180 mTablesViewHash = new Hashtable(); 181 182 mTableView = new DBSelectTableUIStd(); // referenced in createLowerPanel 183 // and createUpperPanel 184 185 mUpperPanel = new JPanel(new BorderLayout()); 186 Vector tables = aSchema.getTables(); 187 Object[] tblArray = null; 188 String[] tableNameArray = null; 189 if (tables != null && tables.size() > 0) { 190 tblArray = tables.toArray(); 191 tableNameArray = new String[tblArray.length]; 192 QuickSort.doSort(tblArray, 0, tblArray.length - 1); 193 for (int i = 0; i < tblArray.length; i++) { 194 DSTableIFace table = (DSTableIFace) tblArray[i]; 195 mModel = new DBSelectTableOverviewModel(table); 196 tableNameArray[i] = table.getName(); 197 mModelHash.put(table.getName(), mModel); 198 if (i == 0) { 199 mSubTableView = new DBSelectTableOverviewTable(mModel); 200 setOverTableView(); 201 202 } 203 204 } 205 } else { 206 tableNameArray = new String[1]; 207 tableNameArray[0] = ""; 208 } 209 210 JPanel schemaSelectionPanel = new JPanel(); 211 schemaSelectionPanel.setLayout(new BoxLayout(schemaSelectionPanel, 212 BoxLayout.X_AXIS)); 213 JLabel label = new JLabel(" Available Table Schemas: "); 214 JComboBox schemaSelection = new JComboBox(tableNameArray); 215 TableSchemaSelectionListener selectionListener = new TableSchemaSelectionListener( 216 this); 217 schemaSelection.addActionListener(selectionListener); 218 schemaSelection.setBackground(Color.WHITE); 219 schemaSelectionPanel.add(label); 220 schemaSelectionPanel.add(schemaSelection); 221 schemaSelectionPanel.add(Box.createHorizontalGlue()); 222 JPanel seperationPane = new JPanel(); 223 seperationPane 224 .setLayout(new BoxLayout(seperationPane, BoxLayout.Y_AXIS)); 225 seperationPane.add(schemaSelectionPanel); 226 seperationPane.add(Box.createVerticalStrut(20)); 227 mUpperPanel.add(seperationPane, BorderLayout.NORTH); 228 229 if (mSubTableView != null) { 230 mTableSchemaPane = new JScrollPane(mSubTableView); 231 mTableView.addFieldChangeListener(mSubTableView); 232 mUpperPanel.add(mTableSchemaPane, BorderLayout.CENTER); 233 } 234 235 valueChanged(null); // enables/disables the add button 236 237 return mUpperPanel; 238 } 239 240 /** 241 * This method will set tableview and its model 242 * 243 */ 244 public void setOverTableView() { 245 if (mSubTableView != null) { 246 mSubTableView.setModel(mModel); 247 mModel.setTableView(mSubTableView); 248 mSubTableView.setColumnSelectionAllowed(false); 249 mSubTableView.setRowSelectionAllowed(false); 250 mSubTableView.setCellSelectionEnabled(false); 251 mSubTableView.getColumn("Field Name").setCellRenderer( 252 new DBSelectTableOverviewCellRenderer()); 253 // mModel.fireTableDataChanged(); 254 } 255 } 256 257 /** 258 * Creates a horizontal panel 259 * 260 * @param threeD 261 * whether it should have a 3D border 262 * @return the panel 263 */ 264 public static JPanel createHorizontalPanel(boolean aThreeD) { 265 Border loweredBorder = new CompoundBorder(new SoftBevelBorder( 266 SoftBevelBorder.LOWERED), new EmptyBorder(5, 5, 5, 5)); 267 JPanel p = new JPanel(); 268 p.setLayout(new BoxLayout(p, BoxLayout.X_AXIS)); 269 p.setAlignmentY(TOP_ALIGNMENT); 270 p.setAlignmentX(LEFT_ALIGNMENT); 271 if (aThreeD) { 272 p.setBorder(loweredBorder); 273 } 274 return p; 275 } 276 277 /** 278 * Creates the radio buttons 279 * 280 * @return the container (panel) 281 */ 282 protected JPanel createRadioButtons() { 283 ButtonGroup group = new ButtonGroup(); 284 285 // Text Radio Buttons 286 JPanel p2 = createHorizontalPanel(true); 287 288 mAllRadio = (JRadioButton) p2.add(new JRadioButton( 289 "Meets ALL included conditions listed below ")); 290 group.add(mAllRadio); 291 mAllRadio.setSelected(true); 292 293 mAnyRadio = (JRadioButton) p2.add(new JRadioButton( 294 "Meets ANY included conditions list below")); 295 group.add(mAnyRadio); 296 297 return p2; 298 } 299 300 /** 301 * Create the lower panel 302 * 303 * @param aSchema 304 * the schema 305 * @return the component 306 */ 307 public JComponent createLowerPanel(DSSchemaIFace aSchema) { 308 // Create table mode and view for the DB Tables 309 mTableModel = new DBSelectTableModelStd(aSchema, mModelHash); 310 mTableView.setColumnSelectionAllowed(false); 311 mTableView.setRowSelectionAllowed(true); 312 mTableView.setCellSelectionEnabled(true); 313 314 mTableView.setModel(mTableModel); 315 mTableView.installEditors(); 316 317 JPanel noviceMainPanel = new JPanel(new BorderLayout()); 318 noviceMainPanel.add(createRadioButtons(), BorderLayout.NORTH); 319 320 JScrollPane scrollpane = new JScrollPane(mTableView); 321 scrollpane.setPreferredSize(new Dimension(700, 300)); 322 noviceMainPanel.add(scrollpane, BorderLayout.CENTER); 323 324 return noviceMainPanel; 325 326 } 327 328 /** 329 * impl of abstract method 330 * 331 */ 332 protected void refresh() { 333 } 334 335 /** 336 * Adds or removes a table tab from the Tabbed Pane 337 * 338 * @param aTabName 339 * name of tab to be changed 340 * @param isSelected 341 * indicates whether it will be added or removed 342 */ 343 /* 344 * public void adjustTab(String aTabName, boolean isSelected) { int inx = 345 * mTabbedpane.indexOfTab(aTabName); if (inx > -1) { if (!isSelected) { 346 * mTabbedpane.removeTabAt(inx); } } else if (isSelected) { 347 * mTabbedpane.add(aTabName, (Component) mTablesViewHash.get(aTabName)); } } 348 */ 349 350 /** 351 * Reset the UI to nothing 352 * 353 */ 354 public void reset() { 355 356 } 357 358 /** 359 * 360 */ 361 /* 362 * class UpdateSimulatedListListAction extends AbstractAction { public void 363 * actionPerformed(ActionEvent e) { JCheckBox cb = (JCheckBox) 364 * e.getSource(); adjustTab(cb.getText(), cb.isSelected()); } } 365 */ 366 367 // --------------------------------------------------- 368 // -- ListSelectionListener 369 // --------------------------------------------------- 370 public void valueChanged(ListSelectionEvent e) { 371 // mAddBtn.setEnabled(mTableList.getSelectedIndex() != -1); 372 } 373 374 // --------------------------------------------------- 375 // -- QBBuilderInterface 376 // --------------------------------------------------- 377 378 /** 379 * 380 * @return returns the "type" of builder it is as defined by the constants 381 * in this interface 382 */ 383 public int getType() { 384 return QBBuilderInterface.STANDARD; 385 } 386 387 /** 388 * A textual name for this builder 389 * 390 * @return string of the name 391 */ 392 public String getName() { 393 return "Standard"; 394 } 395 396 /** 397 * This checks to see if this type of builder can convert the internal SQL 398 * to a more complex or less complex form. 399 * 400 * This is typically called when switching from a more complex builder to a 401 * less complex builder 402 * 403 * @param aBldr 404 * The "receiving" builder, in other words can this builder 405 * convert the SQL to the new builder 406 * @return true if it can convert it, false if it can not 407 */ 408 public boolean canConvertTo(QBBuilderInterface aBldr) { 409 return true; 410 } 411 412 /** 413 * Create SQL string 414 */ 415 public String createSQL() { 416 Hashtable tableNames = new Hashtable(); 417 StringBuffer strBuf = new StringBuffer("SELECT "); 418 DBSelectTableModelStd model = (DBSelectTableModelStd) mTableView 419 .getModel(); 420 421 int criteriaCnt = 0; 422 int displayCnt = 0; 423 for (int i = 0; i < model.getRowCount(); i++) { 424 DBSelectTableModelItem item = (DBSelectTableModelItem) model 425 .getFieldForRow(i); 426 if (item.isDisplayed()) { 427 tableNames.put(item.getTableName(), item.getTableName()); 428 displayCnt++; 429 } 430 431 if (item.getCriteria().length() > 0) { 432 tableNames.put(item.getTableName(), item.getTableName()); 433 criteriaCnt++; 434 } 435 } 436 if (displayCnt == 0) 437 return ""; 438 439 /* 440 * Hashtable displayedHash = new Hashtable(); displayCnt = 0; for (int i 441 * = 0; i < model.getRowCount(); i++) { DBSelectTableModelItem item = 442 * (DBSelectTableModelItem) model.getFieldForRow(i); if 443 * (item.isDisplayed()) { String fullName = 444 * DBUIUtils.getFullFieldName(item.getTableName(), item.getName()); if 445 * (displayedHash.get(fullName) == null) { displayedHash.put(fullName, 446 * "X"); if (displayCnt > 0) { strBuf.append(", "); } displayCnt++; if 447 * (tableNames.size() > 1) { strBuf.append(fullName); } else { 448 * strBuf.append(DBUIUtils.fixNameWithSpaces(item.getName())); } 449 * tableNames.put(item.getTableName(), item.getTableName()); } } } 450 */ 451 452 Hashtable selectFields = proneDuplicateFieldAndWildCard(model); 453 // System.out.println("the select field hash is "+selectFields); 454 if (selectFields != null) { 455 Enumeration em = selectFields.keys(); 456 while (em.hasMoreElements()) { 457 String tableNameStr = (String) em.nextElement(); 458 // System.out.println("The table name is "+tableNameStr); 459 Vector fieldVector = (Vector) selectFields.get(tableNameStr); 460 // System.out.println("the fieldVector is "+fieldVector); 461 if (fieldVector != null) { 462 // System.out.println("the fieldVector is not null"); 463 displayCnt = 0; 464 for (int i = 0; i < fieldVector.size(); i++) { 465 String fieldNameStr = (String) fieldVector.elementAt(i); 466 // System.out.println("the field name is "+fieldNameStr); 467 String fullName = DBUIUtils.getFullFieldName( 468 tableNameStr, fieldNameStr); 469 if (displayCnt > 0) { 470 strBuf.append(", "); 471 } 472 473 if (tableNames.size() > 1) { 474 strBuf.append(fullName); 475 } else { 476 strBuf.append(DBUIUtils 477 .fixNameWithSpaces(fieldNameStr)); 478 } 479 displayCnt++; 480 } 481 } 482 483 } 484 } 485 486 strBuf.append(" FROM "); 487 488 displayCnt = 0; 489 for (Enumeration et = tableNames.elements(); et.hasMoreElements();) { 490 String tableName = (String) et.nextElement(); 491 if (displayCnt > 0) { 492 strBuf.append(", "); 493 } 494 displayCnt++; 495 strBuf.append(tableName); 496 } 497 498 if (criteriaCnt > 0) { 499 criteriaCnt = 0; 500 strBuf.append(" WHERE "); 501 for (int i = 0; i < model.getRowCount(); i++) { 502 DBSelectTableModelItem item = (DBSelectTableModelItem) model 503 .getFieldForRow(i); 504 if (item.getCriteria().length() > 0) { 505 if (criteriaCnt > 0) { 506 strBuf 507 .append(mAllRadio.isSelected() ? " AND " 508 : " OR "); 509 } 510 criteriaCnt++; 511 if (tableNames.size() > 1) { 512 strBuf.append(DBUIUtils.fixNameWithSpaces(item 513 .getTableName()) 514 + "."); 515 } 516 String name = DBUIUtils.fixNameWithSpaces(item.getName()); 517 String criteria = item.getDataType().equals(DataType.STR) ? "'" 518 + item.getCriteria() + "'" 519 : item.getCriteria(); 520 strBuf.append(name 521 + DBSelectTableUIStd.getBoolOperSymbol(item 522 .getOperator()) + criteria); 523 } 524 } 525 } 526 return strBuf.toString(); 527 } 528 529 /* 530 * If selected Field has, the other field will be proned. It will return a 531 * Hashtable Key is table name and value is a vector containing fields 532 * names. The duplicate field will be prone too 533 */ 534 private Hashtable proneDuplicateFieldAndWildCard(DBSelectTableModelStd model) { 535 // if set up this vairable to true, the 536 // sql command select *, day from tableX will be select * from tableX 537 boolean proneWildCard = false; 538 Hashtable tableFields = new Hashtable(); 539 if (model != null) { 540 // System.out.println("model is not null"); 541 for (int i = 0; i < model.getRowCount(); i++) { 542 DBSelectTableModelItem item = (DBSelectTableModelItem) model 543 .getFieldForRow(i); 544 545 if (item.isDisplayed()) { 546 String tableName = item.getTableName(); 547 String fieldName = item.getName(); 548 // System.out.println("The tableName from model "+tableName); 549 // System.out.println("The fieldName from model "+fieldName); 550 Vector fieldNameVector = (Vector) tableFields 551 .get(tableName); 552 if (fieldNameVector == null) { 553 // System.out.println("generate new vector if the vector from hash is null"); 554 fieldNameVector = new Vector(); 555 } 556 557 if (proneWildCard) { 558 // System.out.println("in prone wild card branch"); 559 if (fieldName != null 560 && fieldName 561 .equals(DBQueryDefParserEmitter.WILDCARD)) { 562 // removed all other fields 563 // System.out.println("in handel wild card part"); 564 fieldNameVector = new Vector(); 565 fieldNameVector 566 .add(DBQueryDefParserEmitter.WILDCARD); 567 // System.out.println("add wild card into vector"); 568 tableFields.put(tableName, fieldNameVector); 569 // System.out.println("add table name and vector into hash"); 570 } else if (fieldName != null) { 571 // test if the vector's first value if is wild card 572 // - * (wild card will always in first value) 573 // if it is, we would add this field value 574 String firstField = null; 575 if (!fieldNameVector.isEmpty()) { 576 firstField = (String) fieldNameVector 577 .elementAt(0); 578 // System.out.println("get first element in vector "+firstField); 579 } 580 581 if (firstField == null 582 || !firstField 583 .equals(DBQueryDefParserEmitter.WILDCARD) 584 && !fieldNameVector.contains(fieldName)) { 585 // System.out.println("add file name "+fieldName 586 // +" into vector"); 587 fieldNameVector.add(fieldName); 588 } 589 } 590 tableFields.put(tableName, fieldNameVector); 591 // System.out.println("add table name and vector into hash"); 592 } else { 593 if (!fieldNameVector.contains(fieldName)) { 594 // System.out.println("add file name "+fieldName 595 // +" into vector"); 596 fieldNameVector.add(fieldName); 597 } 598 tableFields.put(tableName, fieldNameVector); 599 // System.out.println("add table name and vector into hash"); 600 } 601 } 602 } 603 } 604 return tableFields; 605 // 606 } 607 608 /** 609 * Build UI from the Query Definition Object 610 */ 611 public int buildFromQueryDef(DBQueryDef aQueryDef) { 612 if (aQueryDef == null) 613 return DBQueryDef.BUILD_ERROR; 614 615 StringBuffer operStr = new StringBuffer(); 616 int status = mTableModel.buildFromQueryDef(aQueryDef, operStr, false); 617 if (operStr.toString().equals(DBWhereOperator.AND_OPER)) { 618 mAllRadio.setSelected(true); 619 } else { 620 mAnyRadio.setSelected(true); 621 } 622 mTableModel.fireTableModelChanged(); 623 repaint(); 624 return status; 625 } 626 627 /** 628 * Fills QueryDef from Model 629 */ 630 public void fillQueryDef(DBQueryDef aQueryDef) { 631 if (aQueryDef == null) 632 return; 633 634 aQueryDef.setIsAdv(false); 635 636 // Collect which items are being displayed and which ones have criteria 637 Hashtable tableNameHash = new Hashtable(); 638 Hashtable itemsDisplayedHash = new Hashtable(); 639 Vector itemsDisplayed = new Vector(); 640 Vector itemsWithCriteria = new Vector(); 641 642 for (int i = 0; i < mTableModel.getRowCount(); i++) { 643 DBSelectTableModelItem item = mTableModel.getFieldForRow(i); 644 if (item.getTableName().length() > 0 && item.getName().length() > 0) { 645 DBSelectTableModelItem newItem = null; 646 647 String fullName = DBUIUtils.getFullFieldName(item 648 .getTableName(), item.getName()); 649 if (itemsDisplayedHash.get(fullName) == null) { 650 if (item.isDisplayed()) { 651 newItem = new DBSelectTableModelItem(item); 652 itemsDisplayedHash.put(fullName, fullName); 653 tableNameHash.put(item.getTableName(), item 654 .getTableName()); 655 itemsDisplayed.add(newItem); 656 } 657 } 658 659 if (item.getCriteria().length() > 0) { 660 tableNameHash.put(item.getTableName(), item.getTableName()); 661 itemsWithCriteria 662 .add(newItem == null ? new DBSelectTableModelItem( 663 item) : newItem); 664 } 665 } 666 } 667 668 // Add each item in the display vector to the QueryDef selects 669 for (Enumeration et = itemsDisplayed.elements(); et.hasMoreElements();) { 670 aQueryDef.addSelectItem((DBSelectTableModelItem) et.nextElement()); 671 } 672 673 // Now create the where object from the items with criteria 674 boolean isSingle = itemsWithCriteria.size() == 1; 675 676 if (itemsWithCriteria.size() > 0) { 677 if (mAllRadio.isSelected()) { 678 Vector joins = new Vector(); 679 680 // loop thru all the items and see if any are joins 681 for (Enumeration et = itemsWithCriteria.elements(); et 682 .hasMoreElements();) { 683 DBSelectTableModelItem item = (DBSelectTableModelItem) et 684 .nextElement(); 685 String oper = item.getOperator(); 686 if (oper != null 687 && oper 688 .equals(DBSelectTableUIStd.OPERS_TXT[DBSelectTableUIStd.EQUALS_INX])) { 689 String criteria = item.getCriteria(); 690 StringBuffer tableName = new StringBuffer(); 691 DSTableFieldIFace rightFld = DBUIUtils 692 .isTableFieldName(mSchema, criteria, tableName); 693 DSTableFieldIFace leftFld = DBUIUtils.getFieldByName( 694 mSchema, item.getTableName(), item.getName()); // not 695 // really 696 // needed 697 if (rightFld != null) { 698 DBSelectTableModelItem leftItem = new DBSelectTableModelItem( 699 item.getTableName(), item.getName(), 700 leftFld.getDataType(), false, "", "", item 701 .getMissingValueCode()); 702 DBSelectTableModelItem rightItem = new DBSelectTableModelItem( 703 tableName.toString(), rightFld.getName(), 704 rightFld.getDataType(), false, "", "", 705 rightFld.getMissingValueCode()); 706 joins.add(leftItem); 707 joins.add(rightItem); 708 item.setName(null); 709 tableNameHash.put(tableName.toString(), tableName 710 .toString()); 711 } 712 } 713 } 714 715 if (joins.size() > 0) { 716 aQueryDef.setJoins(joins); 717 } 718 } 719 720 // Add each table name that used 721 for (Enumeration et = tableNameHash.elements(); et 722 .hasMoreElements();) { 723 aQueryDef.addTable((String) et.nextElement()); 724 } 725 726 DBWhereOperator oper = null; 727 if (!isSingle) { 728 oper = new DBWhereOperator(null, false); 729 oper 730 .setOperator(mAllRadio.isSelected() ? DBWhereOperator.AND_OPER 731 : DBWhereOperator.OR_OPER); 732 } 733 734 boolean itemWasAdded = false; 735 DBWhereCondition cond = null; 736 DBWhereIFace after = null; 737 for (Enumeration et = itemsWithCriteria.elements(); et 738 .hasMoreElements();) { 739 DBSelectTableModelItem item = (DBSelectTableModelItem) et 740 .nextElement(); 741 // skip any item with a null name because it was already used 742 if (item.getName() != null) { 743 cond = new DBWhereCondition(oper, item.getTableName(), item 744 .getName(), item.getDataType()); 745 cond.setOperator(item.getOperator()); 746 cond.setCriteria(item.getCriteria()); 747 if (oper != null) { 748 oper.addAfter(cond, after); 749 itemWasAdded = true; 750 } 751 after = cond; 752 } 753 } 754 755 if (isSingle) { 756 if (cond != null) { 757 aQueryDef.setWhere((DBWhereIFace) cond); 758 } 759 } else if (oper != null && itemWasAdded) { 760 aQueryDef.setWhere((DBWhereIFace) oper); 761 } 762 } 763 } 764 765}