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