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