KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > daffodilwoods > daffodildb > server > sql99 > utils > SelectOrder


1 package com.daffodilwoods.daffodildb.server.sql99.utils;
2
3 import java.util.*;
4
5 import com.daffodilwoods.daffodildb.server.serversystem.*;
6 import com.daffodilwoods.daffodildb.server.sql99.common.*;
7 import com.daffodilwoods.daffodildb.server.sql99.dql.common.*;
8 import com.daffodilwoods.daffodildb.server.sql99.dql.plan.order.*;
9 import com.daffodilwoods.daffodildb.utils.comparator.*;
10 import com.daffodilwoods.database.general.*;
11 import com.daffodilwoods.database.resource.*;
12 import com.daffodilwoods.database.sqlinitiator.*;
13 import com.daffodilwoods.database.utility.*;
14 import com.daffodilwoods.daffodildb.utils.field.FieldBase;
15 import com.daffodilwoods.daffodildb.utils.FieldUtility;
16
17 public class SelectOrder implements _OrderWithTableInformation, TypeConstants, TableExpressionConstants {
18
19    private ColumnDetails[] columns;
20    private boolean isSolvableByIndex;
21    private boolean sameOrReverse;
22    private boolean[] orderSpecification;
23    private SuperComparator[] baseLevelComparators;
24    private boolean adjustedOrder;
25    public SuperComparator orderComparator;
26    public SuperComparator byteComparator;
27
28    public SelectOrder(ColumnDetails[] columns0) throws DException {
29       columns = columns0;
30      orderSpecification = new boolean[columns0.length];
31       Arrays.fill(orderSpecification, true);
32
33    }
34
35    public SelectOrder(ColumnDetails[] columns0, boolean[] orderSpecification0) throws DException {
36       columns = columns0;
37       orderSpecification = orderSpecification0;
38       if (columns.length != orderSpecification.length) {
39          throw new DException("DSE3548", null);
40       }
41    }
42
43    public SelectOrder(ColumnDetails[] columns0, boolean[] orderSpecification0, boolean adjustedOrder0) throws DException {
44       this(columns0, orderSpecification0);
45        adjustedOrder = adjustedOrder0;
46    }
47
48    public SelectOrder(ColumnDetails[] columns0, boolean[] orderSpecification0, SuperComparator orderComparator0) throws DException {
49       columns = columns0;
50       orderSpecification = orderSpecification0;
51       orderComparator = orderComparator0;
52       if (columns.length != orderSpecification.length) {
53          throw new DException("DSE3548", null);
54       }
55    }
56
57    public SelectOrder(ColumnDetails[] columns0, boolean[] orderSpecification0, SuperComparator orderComparator0, boolean adjustedOrder0) throws DException {
58       this(columns0, orderSpecification0, orderComparator0);
59       adjustedOrder = adjustedOrder0;
60    }
61
62    public String JavaDoc[] getColumns() throws DException {
63       int length = columns.length;
64       ArrayList result = new ArrayList();
65       for (int i = 0; i < length; i++) {
66          result.add(columns[i].getColumn());
67       }
68       return (String JavaDoc[]) result.toArray(new String JavaDoc[result.size()]);
69    }
70
71    public int[] getColumnIndexes() throws DException {
72       return new int[columns.length];
73    }
74
75    public boolean[] getOrderOfColumns() throws DException {
76       return orderSpecification;
77    }
78
79    public Object JavaDoc getOrderValues(_VariableValues value) throws DException {
80       ArrayList aList = new ArrayList();
81       for (int i = 0; i < columns.length; i++) {
82          Object JavaDoc oo = null; //
83
if (columns[i].getType() == REFERENCE || (columns[i].getUnderLyingReference())) {
84             oo = value.getColumnValues(columns[i]);
85           } else {
86             oo = columns[i].run(value);
87           }
88          if (oo instanceof Object JavaDoc[]) {
89             aList.addAll(Arrays.asList( (Object JavaDoc[]) oo));
90          } else {
91             aList.add(oo);
92          }
93       }
94
95       Object JavaDoc[] array = aList.toArray(new Object JavaDoc[aList.size()]);
96       return array.length == 1 ? array[0] : array;
97    }
98
99    public ColumnDetails[] getColumnDetails() throws DException {
100       return columns;
101    }
102
103    public ColumnDetails[] getKeyColumnDetails() throws DException {
104       return columns;
105    }
106
107    public _Order[] getBaseLevelOrders() throws DException {
108       return new _Order[] {this};
109    }
110
111    public SuperComparator[] getBaseLevelComparator() throws DException {
112       throw new UnsupportedOperationException JavaDoc("Method getBaseLevelComparator not supported");
113    }
114
115
116    public boolean isAdjustedOrder() throws DException {
117       return adjustedOrder;
118    }
119
120    public void setAdjustedOrder() throws DException {
121       adjustedOrder = true;
122    }
123
124    public SuperComparator getComparator() throws DException {
125       return orderComparator == null ? GeneralPurposeStaticClass.getOrderComparator(columns, orderSpecification) : orderComparator;
126    }
127
128    public SuperComparator getComparatorForBufferRange() throws DException {
129            byteComparator = byteComparator ==
130                null ? GeneralPurposeStaticClass.getOrderComparatorForBufferRange(columns,orderSpecification) : byteComparator;
131            return byteComparator;
132    }
133
134
135    /**
136     * Create an OrderPlan
137     * It divides the order into either groupbyLevel , joinLevel or singleLevel
138     * @param serverSession
139     * @return
140     * @throws DException
141     */

142    public _OrderPlan getOrderPlan(_ServerSession serverSession) throws DException {
143       OrderPlan orderPlan = new OrderPlan();
144
145       switch (getTypeOfOrder()) {
146          case GROUPBYORDERPLAN:
147             orderPlan.setGroupByOrderPlan(this);
148             return orderPlan;
149          case JOINORDERPLAN:
150             orderPlan.setJoinOrderPlan(this);
151             return orderPlan;
152        case QUERYLEVELORDERPLAN :
153             orderPlan.setQueryLevelOrderPlans(this);
154             return orderPlan;
155          default:
156             if (checkForJoinLevelOrder(serverSession)) {
157                orderPlan.setJoinOrderPlan(this);
158                return orderPlan;
159             }
160       }
161       /** @todo sunil Move to case loop*/
162       _SingleTableOrderPlan[] singleTableOrderPlan = OrderPlanMerger.getSingleTableOrderPlans(this);
163       orderPlan.setSingleTableOrderPlans(singleTableOrderPlan);
164       return orderPlan;
165    }
166
167    /**
168     * tells the type of Orderplan that should be created depending upon the columnDetails type
169     * @param columnDetail
170     * @return
171     * @throws DException
172     */

173    public int getType(ColumnDetails columnDetail) throws DException {
174      switch (columnDetail.getType()) {
175          case GROUPING:
176             return GROUPBYORDERPLAN;
177          case CONSTANT:
178             return JOINORDERPLAN;
179           case SCALARSUBQUERY:
180             return QUERYLEVELORDERPLAN;
181          case FUNCTIONAL:
182          case SCALARFUNCTION:
183          case CASEEXPRESSION:
184            case USERFUNCTION :
185
186         return getFunctionalColumnType(columnDetail.getExistingColumnDetails());
187          case REFERENCE:
188             return SINGLETABLEORDERPLAN;
189          default:
190             throw new DException("DSE3519", new Object JavaDoc[] {new Integer JavaDoc(columnDetail.getType())}); // InValid Type
191
}
192    }
193
194  private int getFunctionalColumnType(ColumnDetails[] columns) throws DException {
195    int plantoreturn = -1;
196    for (int i = 0; i < columns.length; i++) {
197             switch (columns[i].getType()) {
198             case GROUPING:
199             return GROUPBYORDERPLAN;
200             case FUNCTIONAL:
201             case SCALARFUNCTION:
202             case CASEEXPRESSION:
203               case USERFUNCTION :
204              plantoreturn = getFunctionalColumnType(columns[i].getExistingColumnDetails());
205           }
206       }
207       /*Done by vibha to solve bug no 11780*/
208     return plantoreturn != -1 ? plantoreturn : QUERYLEVELORDERPLAN ;
209  }
210
211    private boolean checkForJoinLevelOrder(_ServerSession serverSession) throws DException {
212       boolean f1 = checkForMixedTableOrder(columns);
213       boolean f2 = checkForPrimaryColumns(columns, serverSession);
214       return (f1 || !f2);
215    }
216
217    /**
218     * Checks whether the Order contains mixed Sequence of the table
219     * When the Order Sequence contains the Mixed Seqeuence then we can't shift it to the SingleTablePlan level.
220     * @param cd ColumnDetails of the OrderPlan
221     * @return
222     * @throws DException
223     */

224    private boolean checkForMixedTableOrder(ColumnDetails[] cd) throws DException {
225       int len = cd.length;
226       if (len > 2) {
227          for (int i = 0; i < len - 2; i++) {
228             TableDetails table1 = cd[i].getTableDetails();
229             TableDetails nextTable = cd[i + 1].getTableDetails();
230             if (table1 != nextTable) { //checking for Table In Between.
231
for (int j = i + 2; j < len; j++) {
232                   TableDetails table2 = cd[j].getTableDetails();
233                   if (table1 == table2) {
234                      return true;
235                   }
236                }
237             }
238          }
239       }
240       return false;
241    }
242
243    /**
244     * Checks whether the Columns of the Order can provide us uniqueRows.
245     * For Eg:
246     * A1 A2 B1
247     * And A2 is not able to give the Unique Rows then we shift it to joinLevel
248     * Eg
249     * Pakistan Lahore lahoreCantt
250     * India Delhi UttamNagar
251     * India Punjab Chandigarh
252     *
253     * // Method check if there is any column of view involved in the Query than it should be at the last.
254     * For eg
255     * Select * from A , V order by A , V.id , V.id2
256     * We can shift the order to the singleLevel
257     * but for Select * from A , V order by V.id , A.id we can't shift the Order to SingleLevel as it is not at last
258     * For Checking the cases like Select * from V1 , V order by V.id , V1.id
259     * @param cd
260     * @param session
261     * @return
262     * @throws DException
263     */

264    public boolean checkForPrimaryColumns(ColumnDetails[] cd, Object JavaDoc session) throws DException {
265       int len = cd.length;
266       ArrayList checkTableList = new ArrayList(5);
267       boolean flag = false;
268       boolean duplicate = true;
269       TableDetails tableName = null;
270       for (int i = 0; i < cd.length; i++) {
271          if (cd[i].getType() == REFERENCE) {
272             int tableType = cd[i].getTable().getTableType();
273             TableDetails tableIdentifier = cd[i].getTableDetails();
274             if (tableType != TypeConstants.VIEW) {
275                if (i > 0 && flag) {
276                   return false;
277                }
278             } else {
279                flag = true;
280                tableName = tableName == null ? tableIdentifier : tableName;
281                duplicate = tableName == tableIdentifier;
282                if (!duplicate) {
283                   return false;
284                }
285             }
286             if (!checkTableList.contains(tableIdentifier)) {
287                checkTableList.add(tableIdentifier);
288             }
289          } else {
290             return false;
291          }
292       }
293       int size = checkTableList.size();
294       if (size == 1) {
295          return true;
296       }
297       for (int i = 0; i < size - 1; i++) {
298          String JavaDoc[] pks = ( (_ServerSession) session).getUniqueInformation( ( (TableDetails) checkTableList.get(i)).getQualifiedIdentifier());
299          if (pks == null) {
300             return false;
301          }
302          String JavaDoc[] columns = getColumnsForOneTable( ( (TableDetails) checkTableList.get(i)).getQualifiedIdentifier(), cd);
303          boolean bb = checkForPrimaryColumn(pks, columns);
304          if (!bb) {
305             return false;
306          }
307       }
308       return true;
309    }
310
311    private boolean checkForPrimaryColumn(String JavaDoc[] pks, String JavaDoc[] columns) throws DException {
312       if (columns.length < pks.length) {
313          return false;
314       }
315       for (int i = 0; i < pks.length; i++) {
316          int j = 0;
317          for (; j < columns.length; j++) {
318             if ( (pks[i].equalsIgnoreCase(columns[j]))) {
319                break;
320             }
321          }
322          if (j == columns.length) {
323             return false;
324          }
325       }
326       return true;
327    }
328
329    private String JavaDoc[] getColumnsForOneTable(QualifiedIdentifier table, ColumnDetails[] cd) throws DException {
330       ArrayList aList = new ArrayList();
331       for (int i = 0; i < cd.length; i++) {
332          if (cd[i] != null && cd[i].getTable().getQualifiedIdentifier() == table) {
333             aList.add(cd[i].getColumn());
334          }
335       }
336       return (String JavaDoc[]) aList.toArray(new String JavaDoc[aList.size()]);
337    }
338
339    private int search(String JavaDoc[] str1, String JavaDoc c) {
340       int length = str1.length;
341       for (int i = 0; i < length; i++) {
342          if (str1[i].equals(c)) {
343             return i;
344          }
345       }
346       return -1;
347    }
348
349    private int getTypeOfOrder() throws DException {
350       int type = -1;
351       for (int i = 0, length = columns.length; i < length; i++) {
352
353          int temp = getType(columns[i]);
354          if (type < temp) {
355             type = temp;
356          }
357       }
358       return type;
359    }
360
361    public void setSolvableByIndex(boolean orderSolvableByIndex0) throws DException {
362       isSolvableByIndex = orderSolvableByIndex0;
363    }
364
365    public boolean isSolvableByIndex() throws DException {
366       return isSolvableByIndex;
367    }
368
369    public String JavaDoc toString() {
370       try {
371          StringBuffer JavaDoc buffer = new StringBuffer JavaDoc();
372          buffer.append("SELECT_ORDER");
373          buffer.append("[");
374          for (int i = 0; i < columns.length; i++) {
375             buffer.append(columns[i].getColumn() + "," + columns[i].getTable() + "," + orderSpecification[i] + ";");
376          }
377          buffer.append("]");
378          return buffer.toString().trim();
379       } catch (DException ex) {
380          return null;
381       }
382    }
383
384    public _Reference[] getReferences(TableDetails[] tableDetails) throws DException {
385       ArrayList aList = new ArrayList(columns.length);
386       getReferences(columns, tableDetails, aList);
387       return aList.isEmpty() ? null : (_Reference[]) aList.toArray(new _Reference[0]);
388    }
389
390    private void getReferences(ColumnDetails[] columns, TableDetails[] tableDetails, ArrayList aList) throws DException {
391       for (int i = 0; i < columns.length; i++) {
392          _Reference[] ref = columns[i].getReferences(tableDetails);
393          if (ref != null) {
394             aList.addAll(Arrays.asList(ref));
395          }
396       }
397
398    }
399
400    private void handleConstantOuterColumn(ColumnDetails cd, ArrayList aList) throws DException {
401       if (cd.getType() == CONSTANT && cd.getUnderLyingReference()) {
402          aList.add(cd);
403       }
404    }
405
406    private boolean matchTD(ColumnDetails cd, TableDetails[] td) throws DException {
407       if (cd.getTable() == null) {
408          return true;
409       }
410       for (int i = 0; i < td.length; i++) {
411          if (cd.getTable() == td[i]) {
412             return true;
413          }
414       }
415       return false;
416    }
417
418    public void releaseResource() throws DException {
419       orderComparator = null;
420    }
421
422    public void setIndexIsSameOrReverse(boolean flag) {
423       sameOrReverse = flag;
424    }
425
426    public boolean isSameOrReverse() {
427       return sameOrReverse;
428    }
429 }
430
Popular Tags