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}