001 /*
002 // $Id: //open/mondrian-release/3.2/src/main/mondrian/olap4j/MondrianOlap4jCellSet.java#1 $
003 // This software is subject to the terms of the Eclipse Public License v1.0
004 // Agreement, available at the following URL:
005 // http://www.eclipse.org/legal/epl-v10.html.
006 // Copyright (C) 2007-2010 Julian Hyde
007 // All Rights Reserved.
008 // You must accept the terms of that agreement to use this software.
009 */
010 package mondrian.olap4j;
011
012 import org.olap4j.*;
013 import org.olap4j.Cell;
014 import org.olap4j.Position;
015 import mondrian.olap.*;
016 import mondrian.olap.Axis;
017
018 import java.util.*;
019 import java.sql.*;
020 import java.sql.Date;
021 import java.math.BigDecimal;
022 import java.io.InputStream;
023 import java.io.Reader;
024 import java.net.URL;
025
026 /**
027 * Implementation of {@link CellSet}
028 * for the Mondrian OLAP engine.
029 *
030 * <p>This class has sub-classes which implement JDBC 3.0 and JDBC 4.0 APIs;
031 * it is instantiated using {@link Factory#newCellSet}.</p>
032 *
033 * @author jhyde
034 * @version $Id: //open/mondrian-release/3.2/src/main/mondrian/olap4j/MondrianOlap4jCellSet.java#1 $
035 * @since May 24, 2007
036 */
037 abstract class MondrianOlap4jCellSet implements CellSet {
038 final MondrianOlap4jStatement olap4jStatement;
039 final Query query;
040 private Result result;
041 protected boolean closed;
042 private final MondrianOlap4jCellSetMetaData metaData;
043 private final List<CellSetAxis> axisList =
044 new ArrayList<CellSetAxis>();
045 private CellSetAxis filterAxis;
046
047 /**
048 * Creates a MondrianOlap4jCellSet.
049 *
050 * @param olap4jStatement Statement
051 * @param query Mondrian query
052 */
053 public MondrianOlap4jCellSet(
054 MondrianOlap4jStatement olap4jStatement,
055 Query query)
056 {
057 assert olap4jStatement != null;
058 assert query != null;
059 this.olap4jStatement = olap4jStatement;
060 this.query = query;
061 this.closed = false;
062 if (olap4jStatement instanceof MondrianOlap4jPreparedStatement) {
063 this.metaData =
064 ((MondrianOlap4jPreparedStatement) olap4jStatement)
065 .cellSetMetaData;
066 } else {
067 this.metaData =
068 new MondrianOlap4jCellSetMetaData(
069 olap4jStatement, query);
070 }
071 }
072
073 /**
074 * Executes a query. Not part of the olap4j API; internal to the mondrian
075 * driver.
076 *
077 * <p>This method may take some time. While it is executing, a client may
078 * execute {@link MondrianOlap4jStatement#cancel()}.
079 */
080 void execute() {
081 query.setQueryTimeoutMillis(olap4jStatement.timeoutSeconds * 1000);
082 result = olap4jStatement.olap4jConnection.connection.execute(query);
083
084 // initialize axes
085 mondrian.olap.Axis[] axes = result.getAxes();
086 QueryAxis[] queryAxes = result.getQuery().getAxes();
087 assert axes.length == queryAxes.length;
088 for (int i = 0; i < axes.length; i++) {
089 Axis axis = axes[i];
090 QueryAxis queryAxis = queryAxes[i];
091 axisList.add(new MondrianOlap4jCellSetAxis(this, queryAxis, axis));
092 }
093
094 // initialize filter axis
095 QueryAxis queryAxis = result.getQuery().getSlicerAxis();
096 final Axis axis = result.getSlicerAxis();
097 if (queryAxis == null) {
098 // Dummy slicer axis.
099 queryAxis =
100 new QueryAxis(
101 false, null, AxisOrdinal.StandardAxisOrdinal.SLICER,
102 QueryAxis.SubtotalVisibility.Undefined);
103 }
104 filterAxis = new MondrianOlap4jCellSetAxis(this, queryAxis, axis);
105 }
106
107 public CellSetMetaData getMetaData() {
108 return metaData;
109 }
110
111 public List<CellSetAxis> getAxes() {
112 return axisList;
113 }
114
115 public CellSetAxis getFilterAxis() {
116 return filterAxis;
117 }
118
119 public Cell getCell(List<Integer> coordinates) {
120 int[] coords = new int[coordinates.size()];
121 for (int i = 0; i < coords.length; i++) {
122 coords[i] = coordinates.get(i);
123 }
124 return getCellInternal(coords);
125 }
126
127 public Cell getCell(int ordinal) {
128 final int[] pos = ordinalToCoordinateArray(ordinal);
129 return getCellInternal(pos);
130 }
131
132 private int[] ordinalToCoordinateArray(int ordinal) {
133 Axis[] axes = result.getAxes();
134 final int[] pos = new int[axes.length];
135 int modulo = 1;
136 for (int i = 0; i < axes.length; i++) {
137 int prevModulo = modulo;
138 modulo *= axes[i].getPositions().size();
139 pos[i] = (ordinal % modulo) / prevModulo;
140 }
141 if (ordinal < 0 || ordinal >= modulo) {
142 throw new IndexOutOfBoundsException(
143 "Cell ordinal " + ordinal
144 + ") lies outside CellSet bounds ("
145 + getBoundsAsString() + ")");
146 }
147 return pos;
148 }
149
150 public Cell getCell(Position... positions) {
151 int[] coords = new int[positions.length];
152 for (int i = 0; i < coords.length; i++) {
153 coords[i] = positions[i].getOrdinal();
154 }
155 return getCellInternal(coords);
156 }
157
158 private Cell getCellInternal(int[] pos) {
159 mondrian.olap.Cell cell;
160 try {
161 cell = result.getCell(pos);
162 } catch (MondrianException e) {
163 if (e.getMessage().indexOf("coordinates out of range") >= 0) {
164 int[] dimensions = new int[getAxes().size()];
165 for (int i = 0; i < axisList.size(); i++) {
166 dimensions[i] = axisList.get(i).getPositions().size();
167 }
168 throw new IndexOutOfBoundsException(
169 "Cell coordinates (" + getCoordsAsString(pos)
170 + ") fall outside CellSet bounds ("
171 + getCoordsAsString(dimensions) + ")");
172 } else if (e.getMessage().indexOf(
173 "coordinates should have dimension") >= 0)
174 {
175 throw new IllegalArgumentException(
176 "Cell coordinates should have dimension "
177 + axisList.size());
178 } else {
179 throw e;
180 }
181 }
182 return new MondrianOlap4jCell(pos, this, cell);
183 }
184
185 private String getBoundsAsString() {
186 StringBuilder buf = new StringBuilder();
187 Axis[] axes = result.getAxes();
188 for (int i = 0; i < axes.length; i++) {
189 if (i > 0) {
190 buf.append(", ");
191 }
192 buf.append(axes[i].getPositions().size());
193 }
194 return buf.toString();
195 }
196
197 private static String getCoordsAsString(int[] pos) {
198 StringBuilder buf = new StringBuilder();
199 for (int i = 0; i < pos.length; i++) {
200 int po = pos[i];
201 if (i > 0) {
202 buf.append(", ");
203 }
204 buf.append(po);
205 }
206 return buf.toString();
207 }
208
209 public List<Integer> ordinalToCoordinates(int ordinal) {
210 final int[] ints = ordinalToCoordinateArray(ordinal);
211 final List<Integer> list = new ArrayList<Integer>(ints.length);
212 for (int i : ints) {
213 list.add(i);
214 }
215 return list;
216 }
217
218 public int coordinatesToOrdinal(List<Integer> coordinates) {
219 List<CellSetAxis> axes = getAxes();
220 if (coordinates.size() != axes.size()) {
221 throw new IllegalArgumentException(
222 "Coordinates have different dimension " + coordinates.size()
223 + " than axes " + axes.size());
224 }
225 int modulo = 1;
226 int ordinal = 0;
227 int k = 0;
228 for (CellSetAxis axis : axes) {
229 final Integer coordinate = coordinates.get(k++);
230 if (coordinate < 0 || coordinate >= axis.getPositionCount()) {
231 throw new IndexOutOfBoundsException(
232 "Coordinate " + coordinate
233 + " of axis " + k
234 + " is out of range ("
235 + getBoundsAsString() + ")");
236 }
237 ordinal += coordinate * modulo;
238 modulo *= axis.getPositionCount();
239 }
240 return ordinal;
241 }
242
243 public boolean next() throws SQLException {
244 throw new UnsupportedOperationException();
245 }
246
247 public void close() throws SQLException {
248 this.closed = true;
249 }
250
251 public boolean wasNull() throws SQLException {
252 throw new UnsupportedOperationException();
253 }
254
255 public String getString(int columnIndex) throws SQLException {
256 throw new UnsupportedOperationException();
257 }
258
259 public boolean getBoolean(int columnIndex) throws SQLException {
260 throw new UnsupportedOperationException();
261 }
262
263 public byte getByte(int columnIndex) throws SQLException {
264 throw new UnsupportedOperationException();
265 }
266
267 public short getShort(int columnIndex) throws SQLException {
268 throw new UnsupportedOperationException();
269 }
270
271 public int getInt(int columnIndex) throws SQLException {
272 throw new UnsupportedOperationException();
273 }
274
275 public long getLong(int columnIndex) throws SQLException {
276 throw new UnsupportedOperationException();
277 }
278
279 public float getFloat(int columnIndex) throws SQLException {
280 throw new UnsupportedOperationException();
281 }
282
283 public double getDouble(int columnIndex) throws SQLException {
284 throw new UnsupportedOperationException();
285 }
286
287 public BigDecimal getBigDecimal(
288 int columnIndex, int scale) throws SQLException
289 {
290 throw new UnsupportedOperationException();
291 }
292
293 public byte[] getBytes(int columnIndex) throws SQLException {
294 throw new UnsupportedOperationException();
295 }
296
297 public Date getDate(int columnIndex) throws SQLException {
298 throw new UnsupportedOperationException();
299 }
300
301 public Time getTime(int columnIndex) throws SQLException {
302 throw new UnsupportedOperationException();
303 }
304
305 public Timestamp getTimestamp(int columnIndex) throws SQLException {
306 throw new UnsupportedOperationException();
307 }
308
309 public InputStream getAsciiStream(int columnIndex) throws SQLException {
310 throw new UnsupportedOperationException();
311 }
312
313 public InputStream getUnicodeStream(int columnIndex) throws SQLException {
314 throw new UnsupportedOperationException();
315 }
316
317 public InputStream getBinaryStream(int columnIndex) throws SQLException {
318 throw new UnsupportedOperationException();
319 }
320
321 public String getString(String columnLabel) throws SQLException {
322 throw new UnsupportedOperationException();
323 }
324
325 public boolean getBoolean(String columnLabel) throws SQLException {
326 throw new UnsupportedOperationException();
327 }
328
329 public byte getByte(String columnLabel) throws SQLException {
330 throw new UnsupportedOperationException();
331 }
332
333 public short getShort(String columnLabel) throws SQLException {
334 throw new UnsupportedOperationException();
335 }
336
337 public int getInt(String columnLabel) throws SQLException {
338 throw new UnsupportedOperationException();
339 }
340
341 public long getLong(String columnLabel) throws SQLException {
342 throw new UnsupportedOperationException();
343 }
344
345 public float getFloat(String columnLabel) throws SQLException {
346 throw new UnsupportedOperationException();
347 }
348
349 public double getDouble(String columnLabel) throws SQLException {
350 throw new UnsupportedOperationException();
351 }
352
353 public BigDecimal getBigDecimal(
354 String columnLabel, int scale) throws SQLException
355 {
356 throw new UnsupportedOperationException();
357 }
358
359 public byte[] getBytes(String columnLabel) throws SQLException {
360 throw new UnsupportedOperationException();
361 }
362
363 public Date getDate(String columnLabel) throws SQLException {
364 throw new UnsupportedOperationException();
365 }
366
367 public Time getTime(String columnLabel) throws SQLException {
368 throw new UnsupportedOperationException();
369 }
370
371 public Timestamp getTimestamp(String columnLabel) throws SQLException {
372 throw new UnsupportedOperationException();
373 }
374
375 public InputStream getAsciiStream(String columnLabel) throws SQLException {
376 throw new UnsupportedOperationException();
377 }
378
379 public InputStream getUnicodeStream(
380 String columnLabel) throws SQLException
381 {
382 throw new UnsupportedOperationException();
383 }
384
385 public InputStream getBinaryStream(String columnLabel) throws SQLException {
386 throw new UnsupportedOperationException();
387 }
388
389 public SQLWarning getWarnings() throws SQLException {
390 throw new UnsupportedOperationException();
391 }
392
393 public void clearWarnings() throws SQLException {
394 throw new UnsupportedOperationException();
395 }
396
397 public String getCursorName() throws SQLException {
398 throw new UnsupportedOperationException();
399 }
400
401 public Object getObject(int columnIndex) throws SQLException {
402 throw new UnsupportedOperationException();
403 }
404
405 public Object getObject(String columnLabel) throws SQLException {
406 throw new UnsupportedOperationException();
407 }
408
409 public int findColumn(String columnLabel) throws SQLException {
410 throw new UnsupportedOperationException();
411 }
412
413 public Reader getCharacterStream(int columnIndex) throws SQLException {
414 throw new UnsupportedOperationException();
415 }
416
417 public Reader getCharacterStream(String columnLabel) throws SQLException {
418 throw new UnsupportedOperationException();
419 }
420
421 public BigDecimal getBigDecimal(int columnIndex) throws SQLException {
422 throw new UnsupportedOperationException();
423 }
424
425 public BigDecimal getBigDecimal(String columnLabel) throws SQLException {
426 throw new UnsupportedOperationException();
427 }
428
429 public boolean isBeforeFirst() throws SQLException {
430 throw new UnsupportedOperationException();
431 }
432
433 public boolean isAfterLast() throws SQLException {
434 throw new UnsupportedOperationException();
435 }
436
437 public boolean isFirst() throws SQLException {
438 throw new UnsupportedOperationException();
439 }
440
441 public boolean isLast() throws SQLException {
442 throw new UnsupportedOperationException();
443 }
444
445 public void beforeFirst() throws SQLException {
446 throw new UnsupportedOperationException();
447 }
448
449 public void afterLast() throws SQLException {
450 throw new UnsupportedOperationException();
451 }
452
453 public boolean first() throws SQLException {
454 throw new UnsupportedOperationException();
455 }
456
457 public boolean last() throws SQLException {
458 throw new UnsupportedOperationException();
459 }
460
461 public int getRow() throws SQLException {
462 throw new UnsupportedOperationException();
463 }
464
465 public boolean absolute(int row) throws SQLException {
466 throw new UnsupportedOperationException();
467 }
468
469 public boolean relative(int rows) throws SQLException {
470 throw new UnsupportedOperationException();
471 }
472
473 public boolean previous() throws SQLException {
474 throw new UnsupportedOperationException();
475 }
476
477 public void setFetchDirection(int direction) throws SQLException {
478 throw new UnsupportedOperationException();
479 }
480
481 public int getFetchDirection() throws SQLException {
482 throw new UnsupportedOperationException();
483 }
484
485 public void setFetchSize(int rows) throws SQLException {
486 throw new UnsupportedOperationException();
487 }
488
489 public int getFetchSize() throws SQLException {
490 throw new UnsupportedOperationException();
491 }
492
493 public int getType() throws SQLException {
494 throw new UnsupportedOperationException();
495 }
496
497 public int getConcurrency() throws SQLException {
498 throw new UnsupportedOperationException();
499 }
500
501 public boolean rowUpdated() throws SQLException {
502 throw new UnsupportedOperationException();
503 }
504
505 public boolean rowInserted() throws SQLException {
506 throw new UnsupportedOperationException();
507 }
508
509 public boolean rowDeleted() throws SQLException {
510 throw new UnsupportedOperationException();
511 }
512
513 public void updateNull(int columnIndex) throws SQLException {
514 throw new UnsupportedOperationException();
515 }
516
517 public void updateBoolean(int columnIndex, boolean x) throws SQLException {
518 throw new UnsupportedOperationException();
519 }
520
521 public void updateByte(int columnIndex, byte x) throws SQLException {
522 throw new UnsupportedOperationException();
523 }
524
525 public void updateShort(int columnIndex, short x) throws SQLException {
526 throw new UnsupportedOperationException();
527 }
528
529 public void updateInt(int columnIndex, int x) throws SQLException {
530 throw new UnsupportedOperationException();
531 }
532
533 public void updateLong(int columnIndex, long x) throws SQLException {
534 throw new UnsupportedOperationException();
535 }
536
537 public void updateFloat(int columnIndex, float x) throws SQLException {
538 throw new UnsupportedOperationException();
539 }
540
541 public void updateDouble(int columnIndex, double x) throws SQLException {
542 throw new UnsupportedOperationException();
543 }
544
545 public void updateBigDecimal(
546 int columnIndex, BigDecimal x) throws SQLException
547 {
548 throw new UnsupportedOperationException();
549 }
550
551 public void updateString(int columnIndex, String x) throws SQLException {
552 throw new UnsupportedOperationException();
553 }
554
555 public void updateBytes(int columnIndex, byte x[]) throws SQLException {
556 throw new UnsupportedOperationException();
557 }
558
559 public void updateDate(int columnIndex, Date x) throws SQLException {
560 throw new UnsupportedOperationException();
561 }
562
563 public void updateTime(int columnIndex, Time x) throws SQLException {
564 throw new UnsupportedOperationException();
565 }
566
567 public void updateTimestamp(
568 int columnIndex, Timestamp x) throws SQLException
569 {
570 throw new UnsupportedOperationException();
571 }
572
573 public void updateAsciiStream(
574 int columnIndex, InputStream x, int length) throws SQLException
575 {
576 throw new UnsupportedOperationException();
577 }
578
579 public void updateBinaryStream(
580 int columnIndex, InputStream x, int length) throws SQLException
581 {
582 throw new UnsupportedOperationException();
583 }
584
585 public void updateCharacterStream(
586 int columnIndex, Reader x, int length) throws SQLException
587 {
588 throw new UnsupportedOperationException();
589 }
590
591 public void updateObject(
592 int columnIndex, Object x, int scaleOrLength) throws SQLException
593 {
594 throw new UnsupportedOperationException();
595 }
596
597 public void updateObject(int columnIndex, Object x) throws SQLException {
598 throw new UnsupportedOperationException();
599 }
600
601 public void updateNull(String columnLabel) throws SQLException {
602 throw new UnsupportedOperationException();
603 }
604
605 public void updateBoolean(
606 String columnLabel, boolean x) throws SQLException
607 {
608 throw new UnsupportedOperationException();
609 }
610
611 public void updateByte(String columnLabel, byte x) throws SQLException {
612 throw new UnsupportedOperationException();
613 }
614
615 public void updateShort(String columnLabel, short x) throws SQLException {
616 throw new UnsupportedOperationException();
617 }
618
619 public void updateInt(String columnLabel, int x) throws SQLException {
620 throw new UnsupportedOperationException();
621 }
622
623 public void updateLong(String columnLabel, long x) throws SQLException {
624 throw new UnsupportedOperationException();
625 }
626
627 public void updateFloat(String columnLabel, float x) throws SQLException {
628 throw new UnsupportedOperationException();
629 }
630
631 public void updateDouble(String columnLabel, double x) throws SQLException {
632 throw new UnsupportedOperationException();
633 }
634
635 public void updateBigDecimal(
636 String columnLabel, BigDecimal x) throws SQLException
637 {
638 throw new UnsupportedOperationException();
639 }
640
641 public void updateString(String columnLabel, String x) throws SQLException {
642 throw new UnsupportedOperationException();
643 }
644
645 public void updateBytes(String columnLabel, byte x[]) throws SQLException {
646 throw new UnsupportedOperationException();
647 }
648
649 public void updateDate(String columnLabel, Date x) throws SQLException {
650 throw new UnsupportedOperationException();
651 }
652
653 public void updateTime(String columnLabel, Time x) throws SQLException {
654 throw new UnsupportedOperationException();
655 }
656
657 public void updateTimestamp(
658 String columnLabel, Timestamp x) throws SQLException
659 {
660 throw new UnsupportedOperationException();
661 }
662
663 public void updateAsciiStream(
664 String columnLabel, InputStream x, int length) throws SQLException
665 {
666 throw new UnsupportedOperationException();
667 }
668
669 public void updateBinaryStream(
670 String columnLabel, InputStream x, int length) throws SQLException
671 {
672 throw new UnsupportedOperationException();
673 }
674
675 public void updateCharacterStream(
676 String columnLabel, Reader reader, int length) throws SQLException
677 {
678 throw new UnsupportedOperationException();
679 }
680
681 public void updateObject(
682 String columnLabel, Object x, int scaleOrLength) throws SQLException
683 {
684 throw new UnsupportedOperationException();
685 }
686
687 public void updateObject(String columnLabel, Object x) throws SQLException {
688 throw new UnsupportedOperationException();
689 }
690
691 public void insertRow() throws SQLException {
692 throw new UnsupportedOperationException();
693 }
694
695 public void updateRow() throws SQLException {
696 throw new UnsupportedOperationException();
697 }
698
699 public void deleteRow() throws SQLException {
700 throw new UnsupportedOperationException();
701 }
702
703 public void refreshRow() throws SQLException {
704 throw new UnsupportedOperationException();
705 }
706
707 public void cancelRowUpdates() throws SQLException {
708 throw new UnsupportedOperationException();
709 }
710
711 public void moveToInsertRow() throws SQLException {
712 throw new UnsupportedOperationException();
713 }
714
715 public void moveToCurrentRow() throws SQLException {
716 throw new UnsupportedOperationException();
717 }
718
719 public Statement getStatement() throws SQLException {
720 throw new UnsupportedOperationException();
721 }
722
723 public Object getObject(
724 int columnIndex, Map<String, Class<?>> map) throws SQLException
725 {
726 throw new UnsupportedOperationException();
727 }
728
729 public Ref getRef(int columnIndex) throws SQLException {
730 throw new UnsupportedOperationException();
731 }
732
733 public Blob getBlob(int columnIndex) throws SQLException {
734 throw new UnsupportedOperationException();
735 }
736
737 public Clob getClob(int columnIndex) throws SQLException {
738 throw new UnsupportedOperationException();
739 }
740
741 public Array getArray(int columnIndex) throws SQLException {
742 throw new UnsupportedOperationException();
743 }
744
745 public Object getObject(
746 String columnLabel, Map<String, Class<?>> map) throws SQLException
747 {
748 throw new UnsupportedOperationException();
749 }
750
751 public Ref getRef(String columnLabel) throws SQLException {
752 throw new UnsupportedOperationException();
753 }
754
755 public Blob getBlob(String columnLabel) throws SQLException {
756 throw new UnsupportedOperationException();
757 }
758
759 public Clob getClob(String columnLabel) throws SQLException {
760 throw new UnsupportedOperationException();
761 }
762
763 public Array getArray(String columnLabel) throws SQLException {
764 throw new UnsupportedOperationException();
765 }
766
767 public Date getDate(int columnIndex, Calendar cal) throws SQLException {
768 throw new UnsupportedOperationException();
769 }
770
771 public Date getDate(String columnLabel, Calendar cal) throws SQLException {
772 throw new UnsupportedOperationException();
773 }
774
775 public Time getTime(int columnIndex, Calendar cal) throws SQLException {
776 throw new UnsupportedOperationException();
777 }
778
779 public Time getTime(String columnLabel, Calendar cal) throws SQLException {
780 throw new UnsupportedOperationException();
781 }
782
783 public Timestamp getTimestamp(
784 int columnIndex, Calendar cal) throws SQLException
785 {
786 throw new UnsupportedOperationException();
787 }
788
789 public Timestamp getTimestamp(
790 String columnLabel, Calendar cal) throws SQLException
791 {
792 throw new UnsupportedOperationException();
793 }
794
795 public URL getURL(int columnIndex) throws SQLException {
796 throw new UnsupportedOperationException();
797 }
798
799 public URL getURL(String columnLabel) throws SQLException {
800 throw new UnsupportedOperationException();
801 }
802
803 public void updateRef(int columnIndex, Ref x) throws SQLException {
804 throw new UnsupportedOperationException();
805 }
806
807 public void updateRef(String columnLabel, Ref x) throws SQLException {
808 throw new UnsupportedOperationException();
809 }
810
811 public void updateBlob(int columnIndex, Blob x) throws SQLException {
812 throw new UnsupportedOperationException();
813 }
814
815 public void updateBlob(String columnLabel, Blob x) throws SQLException {
816 throw new UnsupportedOperationException();
817 }
818
819 public void updateClob(int columnIndex, Clob x) throws SQLException {
820 throw new UnsupportedOperationException();
821 }
822
823 public void updateClob(String columnLabel, Clob x) throws SQLException {
824 throw new UnsupportedOperationException();
825 }
826
827 public void updateArray(int columnIndex, Array x) throws SQLException {
828 throw new UnsupportedOperationException();
829 }
830
831 public void updateArray(String columnLabel, Array x) throws SQLException {
832 throw new UnsupportedOperationException();
833 }
834
835 // implement Wrapper
836
837 public <T> T unwrap(Class<T> iface) throws SQLException {
838 throw new UnsupportedOperationException();
839 }
840
841 public boolean isWrapperFor(Class<?> iface) throws SQLException {
842 throw new UnsupportedOperationException();
843 }
844 }
845
846 // End MondrianOlap4jCellSet.java