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