001 /* 002 // $Id: Property.java 485 2012-01-17 06:57:57Z jhyde $ 003 // 004 // Licensed to Julian Hyde under one or more contributor license 005 // agreements. See the NOTICE file distributed with this work for 006 // additional information regarding copyright ownership. 007 // 008 // Julian Hyde licenses this file to you under the Apache License, 009 // Version 2.0 (the "License"); you may not use this file except in 010 // compliance with the License. You may obtain a copy of the License at: 011 // 012 // http://www.apache.org/licenses/LICENSE-2.0 013 // 014 // Unless required by applicable law or agreed to in writing, software 015 // distributed under the License is distributed on an "AS IS" BASIS, 016 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 017 // See the License for the specific language governing permissions and 018 // limitations under the License. 019 */ 020 package org.olap4j.metadata; 021 022 import org.olap4j.impl.Olap4jUtil; 023 024 import java.util.Collections; 025 import java.util.Set; 026 027 /** 028 * Definition of a property of a {@link Member} or 029 * {@link org.olap4j.Cell}. 030 * 031 * @author jhyde 032 * @version $Id: Property.java 485 2012-01-17 06:57:57Z jhyde $ 033 * @since Aug 23, 2006 034 */ 035 public interface Property extends MetadataElement { 036 /** 037 * Returns the datatype of this Property. 038 * 039 * @return datatype of this Property 040 */ 041 Datatype getDatatype(); 042 043 /** 044 * Returns a set of flags which describe the type of this Property. 045 * 046 * @return type of this Property 047 */ 048 Set<TypeFlag> getType(); 049 050 /** 051 * Returns the content type of this Property. 052 * 053 * @return content type 054 */ 055 ContentType getContentType(); 056 057 /** 058 * Enumeration of aspects of the type of a Property. In particular, whether 059 * it belongs to a member or a cell. 060 * 061 * <p>The values are as specified by XMLA for the PROPERTY_TYPE attribute 062 * of the MDSCHEMA_PROPERTIES data set. 063 * For example, XMLA specifies that the value 9 (0x1 | 0x8) means that a 064 * property belongs to a member and is a binary large object (BLOB). 065 * In this case, {@link Property#getType} will return the {@link Set} 066 * {{@link #MEMBER}, {@link #BLOB}}. 067 */ 068 enum TypeFlag implements XmlaConstant { 069 /** 070 * Identifies a property of a member. This property can be used in the 071 * DIMENSION PROPERTIES clause of the SELECT statement. 072 */ 073 MEMBER(1), 074 075 /** 076 * Identifies a property of a cell. This property can be used in the 077 * CELL PROPERTIES clause that occurs at the end of the SELECT 078 * statement. 079 */ 080 CELL(2), 081 082 /** 083 * Identifies an internal property. 084 */ 085 SYSTEM(4), 086 087 /** 088 * Identifies a property which contains a binary large object (blob). 089 */ 090 BLOB(8); 091 092 private final int xmlaOrdinal; 093 094 public static final Set<TypeFlag> CELL_TYPE_FLAG = 095 Collections.unmodifiableSet( 096 Olap4jUtil.enumSetOf(TypeFlag.CELL)); 097 public static final Set<TypeFlag> MEMBER_TYPE_FLAG = 098 Collections.unmodifiableSet( 099 Olap4jUtil.enumSetOf(TypeFlag.MEMBER)); 100 private static final DictionaryImpl<TypeFlag> DICTIONARY = 101 DictionaryImpl.forClass(TypeFlag.class); 102 103 private TypeFlag(int xmlaOrdinal) { 104 this.xmlaOrdinal = xmlaOrdinal; 105 } 106 107 public String xmlaName() { 108 return "MDPROP_" + name(); 109 } 110 111 public String getDescription() { 112 return null; 113 } 114 115 public int xmlaOrdinal() { 116 return xmlaOrdinal; 117 } 118 119 /** 120 * Per {@link org.olap4j.metadata.XmlaConstant}, returns a dictionary 121 * of all values of this enumeration. 122 * 123 * @return Dictionary of all values 124 */ 125 public static Dictionary<TypeFlag> getDictionary() { 126 return DICTIONARY; 127 } 128 } 129 130 /** 131 * Enumeration of the system properties available for every {@link Member}. 132 * 133 * <p>The following properties are mandatory for members:<ul> 134 * <li>{@link #CATALOG_NAME}</li> 135 * <li>{@link #SCHEMA_NAME}</li> 136 * <li>{@link #CUBE_NAME}</li> 137 * <li>{@link #DIMENSION_UNIQUE_NAME}</li> 138 * <li>{@link #HIERARCHY_UNIQUE_NAME}</li> 139 * <li>{@link #LEVEL_UNIQUE_NAME}</li> 140 * <li>{@link #LEVEL_NUMBER}</li> 141 * <li>{@link #MEMBER_UNIQUE_NAME}</li> 142 * <li>{@link #MEMBER_NAME}</li> 143 * <li>{@link #MEMBER_TYPE}</li> 144 * <li>{@link #MEMBER_GUID}</li> 145 * <li>{@link #MEMBER_CAPTION}</li> 146 * <li>{@link #MEMBER_ORDINAL}</li> 147 * <li>{@link #CHILDREN_CARDINALITY}</li> 148 * <li>{@link #PARENT_LEVEL}</li> 149 * <li>{@link #PARENT_UNIQUE_NAME}</li> 150 * <li>{@link #PARENT_COUNT}</li> 151 * <li>{@link #DESCRIPTION}</li> 152 * </ul> 153 */ 154 enum StandardMemberProperty implements Property { 155 156 /** 157 * Definition of the property which 158 * holds the name of the current catalog. 159 */ 160 CATALOG_NAME( 161 Datatype.STRING, 162 10, 163 false, 164 null, 165 "Optional. The name of the catalog to which this member belongs. " 166 + "NULL if the provider does not support catalogs."), 167 168 /** 169 * Definition of the property which 170 * holds the name of the current schema. 171 */ 172 SCHEMA_NAME( 173 Datatype.STRING, 174 11, 175 false, 176 null, 177 "Optional. The name of the schema to which this member belongs. " 178 + "NULL if the provider does not support schemas."), 179 180 /** 181 * Definition of the property which 182 * holds the name of the current cube. 183 */ 184 CUBE_NAME( 185 Datatype.STRING, 186 12, 187 false, 188 null, "Required. Name of the cube to which this member belongs."), 189 190 /** 191 * Definition of the property which 192 * holds the unique name of the current dimension. 193 */ 194 DIMENSION_UNIQUE_NAME( 195 Datatype.STRING, 196 13, 197 false, 198 null, 199 "Required. Unique name of the dimension to which this member " 200 + "belongs. For providers that generate unique names by " 201 + "qualification, each component of this name is delimited."), 202 203 /** 204 * Definition of the property which 205 * holds the unique name of the current hierarchy. 206 */ 207 HIERARCHY_UNIQUE_NAME( 208 Datatype.STRING, 209 14, 210 false, 211 null, 212 "Required. Unique name of the hierarchy. If the member belongs to " 213 + "more than one hierarchy, there is one row for each hierarchy " 214 + "to which it belongs. For providers that generate unique names " 215 + "by qualification, each component of this name is delimited."), 216 217 /** 218 * Definition of the property which 219 * holds the unique name of the current level. 220 */ 221 LEVEL_UNIQUE_NAME( 222 Datatype.STRING, 223 15, 224 false, 225 null, 226 "Required. Unique name of the level to which the member belongs. " 227 + "For providers that generate unique names by qualification, " 228 + "each component of this name is delimited."), 229 230 /** 231 * Definition of the property which 232 * holds the ordinal of the current level. 233 */ 234 LEVEL_NUMBER( 235 Datatype.UNSIGNED_INTEGER, 236 16, 237 false, 238 null, 239 "Required. The distance of the member from the root of the " 240 + "hierarchy. The root level is zero."), 241 242 /** 243 * Definition of the property which 244 * holds the ordinal of the current member. 245 */ 246 MEMBER_ORDINAL( 247 Datatype.UNSIGNED_INTEGER, 248 17, 249 false, 250 null, 251 "Required. Ordinal number of the member. Sort rank of the member " 252 + "when members of this dimension are sorted in their natural " 253 + "sort order. If providers do not have the concept of natural " 254 + "ordering, this should be the rank when sorted by MEMBER_NAME."), 255 256 /** 257 * Definition of the property which 258 * holds the name of the current member. 259 */ 260 MEMBER_NAME( 261 Datatype.STRING, 262 18, 263 false, 264 null, 265 "Required. Name of the member."), 266 267 /** 268 * Definition of the property which 269 * holds the unique name of the current member. 270 */ 271 MEMBER_UNIQUE_NAME( 272 Datatype.STRING, 273 19, 274 false, 275 null, 276 "Required. Unique name of the member. For providers that generate " 277 + "unique names by qualification, each component of this name is " 278 + "delimited."), 279 280 /** 281 * Definition of the property which 282 * holds the type of the member. 283 */ 284 MEMBER_TYPE( 285 Datatype.STRING, 286 20, 287 false, 288 null, 289 "Required. Type of the member. Can be one of the following values: " 290 + "MDMEMBER_Datatype.TYPE_REGULAR, MDMEMBER_Datatype.TYPE_ALL, " 291 + "MDMEMBER_Datatype.TYPE_FORMULA, MDMEMBER_Datatype.TYPE_MEASURE, " 292 + "MDMEMBER_Datatype.TYPE_UNKNOWN. MDMEMBER_Datatype.TYPE_FORMULA " 293 + "takes precedence over MDMEMBER_Datatype.TYPE_MEASURE. " 294 + "Therefore, if there is a formula (calculated) member on the " 295 + "Measures dimension, it is listed as " 296 + "MDMEMBER_Datatype.TYPE_FORMULA."), 297 298 /** 299 * Definition of the property which 300 * holds the GUID of the member 301 */ 302 MEMBER_GUID( 303 Datatype.STRING, 304 21, 305 false, 306 null, 307 "Optional. Member GUID. NULL if no GUID exists."), 308 309 /** 310 * Definition of the property which 311 * holds the label or caption associated with the member, or the 312 * member's name if no caption is defined. 313 */ 314 MEMBER_CAPTION( 315 Datatype.STRING, 316 22, 317 false, 318 null, 319 "Required. A label or caption associated with the member. Used " 320 + "primarily for display purposes. If a caption does not exist, " 321 + "MEMBER_NAME is returned."), 322 323 /** 324 * Definition of the property which holds the 325 * number of children this member has. 326 */ 327 CHILDREN_CARDINALITY( 328 Datatype.UNSIGNED_INTEGER, 329 23, 330 false, 331 null, 332 "Required. Number of children that the member has. This can be an " 333 + "estimate, so consumers should not rely on this to be the exact " 334 + "count. Providers should return the best estimate possible."), 335 336 /** 337 * Definition of the property which holds the 338 * distance from the root of the hierarchy of this member's parent. 339 */ 340 PARENT_LEVEL( 341 Datatype.UNSIGNED_INTEGER, 342 24, 343 false, 344 null, 345 "Required. The distance of the member's parent from the root level " 346 + "of the hierarchy. The root level is zero."), 347 348 /** 349 * Definition of the property which holds the 350 * Name of the current catalog. 351 */ 352 PARENT_UNIQUE_NAME( 353 Datatype.STRING, 354 25, 355 false, 356 null, 357 "Required. Unique name of the member's parent. NULL is returned " 358 + "for any members at the root level. For providers that generate " 359 + "unique names by qualification, each component of this name is " 360 + "delimited."), 361 362 /** 363 * Definition of the property which holds the 364 * number of parents that this member has. Generally 1, or 0 365 * for root members. 366 */ 367 PARENT_COUNT( 368 Datatype.UNSIGNED_INTEGER, 369 26, 370 false, 371 null, 372 "Required. Number of parents that this member has."), 373 374 /** 375 * Definition of the property which holds the 376 * description of this member. 377 */ 378 DESCRIPTION( 379 Datatype.STRING, 380 27, 381 false, 382 null, 383 "Optional. A human-readable description of the member."), 384 385 /** 386 * Definition of the internal property which holds the 387 * name of the system property which determines whether to show a member 388 * (especially a measure or calculated member) in a user interface such 389 * as JPivot. 390 */ 391 $visible( 392 Datatype.BOOLEAN, 393 28, 394 true, 395 null, 396 null), 397 398 /** 399 * Definition of the internal property which holds the 400 * value of the member key in the original data type. MEMBER_KEY is for 401 * backward-compatibility. MEMBER_KEY has the same value as KEY0 for 402 * non-composite keys, and MEMBER_KEY property is null for composite 403 * keys. 404 */ 405 MEMBER_KEY( 406 Datatype.VARIANT, 407 29, 408 true, 409 null, 410 "Optional. The value of the member key. Null for composite keys."), 411 412 /** 413 * Definition of the boolean property that indicates whether 414 * a member is a placeholder member for an empty position in a 415 * dimension hierarchy. 416 */ 417 IS_PLACEHOLDERMEMBER( 418 Datatype.BOOLEAN, 419 30, 420 false, 421 null, 422 "Required. Whether the member is a placeholder member for an empty " 423 + "position in a dimension hierarchy."), 424 425 /** 426 * Definition of the property that indicates whether the member is a 427 * data member. 428 */ 429 IS_DATAMEMBER( 430 Datatype.BOOLEAN, 431 31, 432 false, 433 null, 434 "Required. whether the member is a data member"), 435 436 /** 437 * Definition of the property which 438 * holds the level depth of a member. 439 * 440 * <p>Caution: Level depth of members in parent-child hierarchy isn't 441 * from their levels. It's calculated from the underlying data 442 * dynamically. 443 */ 444 DEPTH( 445 Datatype.UNSIGNED_INTEGER, 446 43, 447 true, 448 null, 449 "The level depth of a member"), 450 451 /** 452 * Definition of the property which 453 * holds the DISPLAY_INFO required by XML/A. 454 * 455 * <p>Caution: This property's value is calculated based on a specified 456 * MDX query, so its value is dynamic at runtime. 457 */ 458 DISPLAY_INFO( 459 Datatype.UNSIGNED_INTEGER, 460 44, 461 false, 462 null, 463 "Display instruction of a member for XML/A"), 464 465 /** 466 * Definition of the property which 467 * holds the value of a cell. Is usually numeric (since most measures 468 * are numeric) but is occasionally another type. 469 */ 470 VALUE( 471 Datatype.VARIANT, 472 41, 473 false, 474 null, 475 "The unformatted value of the cell."); 476 477 private final Datatype type; 478 private final String description; 479 private final boolean internal; 480 481 private StandardMemberProperty( 482 Datatype type, 483 int ordinal, 484 boolean internal, 485 Class<? extends Enum> enumClazz, 486 String description) 487 { 488 // assert ordinal == ordinal(); 489 this.internal = internal; 490 this.type = type; 491 this.description = description; 492 } 493 494 public String getName() { 495 return name(); 496 } 497 498 public String getUniqueName() { 499 return name(); 500 } 501 502 public String getCaption() { 503 // NOTE: This caption will be the same in all locales, since 504 // StandardMemberProperty has no way of deducing the current 505 // connection. Providers that wish to localize the caption of 506 // built-in properties should create a wrapper around 507 // StandardMemberProperty that is aware of the current connection or 508 // locale. 509 return name(); 510 } 511 512 public String getDescription() { 513 // NOTE: This description will be the same in all locales, since 514 // StandardMemberProperty has no way of deducing the current 515 // connection. Providers that wish to localize the description of 516 // built-in properties should create a wrapper around 517 // StandardCellProperty that is aware of the current connection or 518 // locale. 519 return description; 520 } 521 522 public Datatype getDatatype() { 523 return type; 524 } 525 526 public Set<TypeFlag> getType() { 527 return TypeFlag.MEMBER_TYPE_FLAG; 528 } 529 530 public ContentType getContentType() { 531 return ContentType.REGULAR; 532 } 533 534 public boolean isInternal() { 535 return internal; 536 } 537 538 public boolean isVisible() { 539 return !internal; 540 } 541 } 542 543 /** 544 * Enumeration of the system properties available for every 545 * {@link org.olap4j.Cell}. 546 * 547 * <p>The following propertiess are mandatory for cells:<ul> 548 * <li>{@link #BACK_COLOR}</li> 549 * <li>{@link #CELL_EVALUATION_LIST}</li> 550 * <li>{@link #CELL_ORDINAL}</li> 551 * <li>{@link #FORE_COLOR}</li> 552 * <li>{@link #FONT_NAME}</li> 553 * <li>{@link #FONT_SIZE}</li> 554 * <li>{@link #FONT_FLAGS}</li> 555 * <li>{@link #FORMAT_STRING}</li> 556 * <li>{@link #FORMATTED_VALUE}</li> 557 * <li>{@link #NON_EMPTY_BEHAVIOR}</li> 558 * <li>{@link #SOLVE_ORDER}</li> 559 * <li>{@link #VALUE}</li> 560 * </ul> 561 */ 562 enum StandardCellProperty implements Property { 563 BACK_COLOR( 564 Datatype.STRING, 565 30, 566 false, 567 null, 568 "The background color for displaying the VALUE or FORMATTED_VALUE " 569 + "property. For more information, see FORE_COLOR and BACK_COLOR " 570 + "Contents."), 571 572 CELL_EVALUATION_LIST( 573 Datatype.STRING, 574 31, 575 false, 576 null, 577 "The semicolon-delimited list of evaluated formulas applicable to " 578 + "the cell, in order from lowest to highest solve order. For more " 579 + "information about solve order, see Understanding Pass Order and " 580 + "Solve Order"), 581 582 CELL_ORDINAL( 583 Datatype.UNSIGNED_INTEGER, 584 32, 585 false, 586 null, 587 "The ordinal number of the cell in the dataset."), 588 589 FORE_COLOR( 590 Datatype.STRING, 591 33, 592 false, 593 null, 594 "The foreground color for displaying the VALUE or FORMATTED_VALUE " 595 + "property. For more information, see FORE_COLOR and BACK_COLOR " 596 + "Contents."), 597 598 FONT_NAME( 599 Datatype.STRING, 600 34, 601 false, 602 null, 603 "The font to be used to display the VALUE or FORMATTED_VALUE " 604 + "property."), 605 606 FONT_SIZE( 607 Datatype.STRING, 608 35, 609 false, 610 null, 611 "Font size to be used to display the VALUE or FORMATTED_VALUE " 612 + "property."), 613 614 FONT_FLAGS( 615 Datatype.UNSIGNED_INTEGER, 616 36, 617 false, 618 XmlaConstants.FontFlag.class, 619 "The bitmask detailing effects on the font. The value is the " 620 + "result of a bitwise OR operation of one or more of the " 621 + "following constants: MDFF_BOLD = 1, MDFF_ITALIC = 2, " 622 + "MDFF_UNDERLINE = 4, MDFF_STRIKEOUT = 8. For example, the value " 623 + "5 represents the combination of bold (MDFF_BOLD) and underline " 624 + "(MDFF_UNDERLINE) font effects."), 625 626 /** 627 * Definition of the property which 628 * holds the formatted value of a cell. 629 */ 630 FORMATTED_VALUE( 631 Datatype.STRING, 632 37, 633 false, 634 null, 635 "The character string that represents a formatted display of the " 636 + "VALUE property."), 637 638 /** 639 * Definition of the property which 640 * holds the format string used to format cell values. 641 */ 642 FORMAT_STRING( 643 Datatype.STRING, 644 38, 645 false, 646 null, 647 "The format string used to create the FORMATTED_VALUE property " 648 + "value. For more information, see FORMAT_STRING Contents."), 649 650 NON_EMPTY_BEHAVIOR( 651 Datatype.STRING, 652 39, 653 false, 654 null, 655 "The measure used to determine the behavior of calculated members " 656 + "when resolving empty cells."), 657 658 /** 659 * Definition of the property which 660 * determines the solve order of a calculated member with respect to 661 * other calculated members. 662 */ 663 SOLVE_ORDER( 664 Datatype.INTEGER, 665 40, 666 false, 667 null, 668 "The solve order of the cell."), 669 670 /** 671 * Definition of the property which 672 * holds the value of a cell. Is usually numeric (since most measures 673 * are numeric) but is occasionally another type. 674 */ 675 VALUE( 676 Datatype.VARIANT, 677 41, 678 false, 679 null, 680 "The unformatted value of the cell."), 681 682 /** 683 * Definition of the property which 684 * holds the datatype of a cell. Valid values are "String", 685 * "Numeric", "Integer". The property's value derives from the 686 * "datatype" attribute of the "Measure" element; if the 687 * datatype attribute is not specified, the datatype is 688 * "Numeric" by default, except measures whose aggregator is 689 * "Count", whose datatype is "Integer". 690 */ 691 DATATYPE( 692 Datatype.STRING, 693 42, 694 false, 695 null, 696 "The datatype of the cell."), 697 698 LANGUAGE( 699 Datatype.UNSIGNED_INTEGER, 700 0, 701 false, 702 null, 703 "The locale where the FORMAT_STRING will be applied. LANGUAGE is " 704 + "usually used for currency conversion."), 705 706 ACTION_TYPE( 707 Datatype.INT4, 708 0, 709 false, 710 XmlaConstants.ActionType.class, 711 "A bitmask that indicates which types of actions exist on the " 712 + "cell."), 713 714 UPDATEABLE( 715 Datatype.UNSIGNED_INTEGER, 716 0, 717 false, 718 XmlaConstants.Updateable.class, 719 "A value that indicates whether the cell can be updated."); 720 721 /** 722 * The datatype of the property. 723 */ 724 private final Datatype type; 725 private final String description; 726 private final boolean internal; 727 728 private StandardCellProperty( 729 Datatype type, 730 int ordinal, 731 boolean internal, 732 Class<? extends Enum> enumClazz, 733 String description) 734 { 735 this.type = type; 736 this.internal = internal; 737 this.description = description; 738 } 739 740 public Datatype getDatatype() { 741 return type; 742 } 743 744 public Set<TypeFlag> getType() { 745 return TypeFlag.CELL_TYPE_FLAG; 746 } 747 748 public String getName() { 749 return name(); 750 } 751 752 public String getUniqueName() { 753 return name(); 754 } 755 756 public String getCaption() { 757 // NOTE: This caption will be the same in all locales, since 758 // StandardCellProperty has no way of deducing the current 759 // connection. Providers that wish to localize the caption of 760 // built-in properties should create a wrapper around 761 // StandardCellProperty that is aware of the current connection or 762 // locale. 763 return name(); 764 } 765 766 public String getDescription() { 767 // NOTE: This description will be the same in all locales, since 768 // StandardCellProperty has no way of deducing the current 769 // connection. Providers that wish to localize the description of 770 // built-in properties should create a wrapper around 771 // StandardCellProperty that is aware of the current connection or 772 // locale. 773 return description; 774 } 775 776 public boolean isInternal() { 777 return internal; 778 } 779 780 public boolean isVisible() { 781 return !internal; 782 } 783 784 public ContentType getContentType() { 785 return ContentType.REGULAR; 786 } 787 } 788 789 /** 790 * Enumeration of the types of a <code>Property</code>. 791 * 792 * <p>The values are as specified by XMLA. 793 * For example, XMLA specifies MD_PROPTYPE_CAPTION with ordinal 0x21, 794 * which corresponds to the value {@link #CAPTION}, 795 * whose {@link #xmlaOrdinal} is 0x21. 796 */ 797 enum ContentType implements XmlaConstant { 798 REGULAR(0x00), 799 ID(0x01), 800 RELATION_TO_PARENT(0x02), 801 ROLLUP_OPERATOR(0x03), 802 ORG_TITLE(0x11), 803 CAPTION(0x21), 804 CAPTION_SHORT(0x22), 805 CAPTION_DESCRIPTION(0x23), 806 CAPTION_ABREVIATION(0x24), 807 WEB_URL(0x31), 808 WEB_HTML(0x32), 809 WEB_XML_OR_XSL(0x33), 810 WEB_MAIL_ALIAS(0x34), 811 ADDRESS(0x41), 812 ADDRESS_STREET(0x42), 813 ADDRESS_HOUSE(0x43), 814 ADDRESS_CITY(0x44), 815 ADDRESS_STATE_OR_PROVINCE(0x45), 816 ADDRESS_ZIP(0x46), 817 ADDRESS_QUARTER(0x47), 818 ADDRESS_COUNTRY(0x48), 819 ADDRESS_BUILDING(0x49), 820 ADDRESS_ROOM(0x4A), 821 ADDRESS_FLOOR(0x4B), 822 ADDRESS_FAX(0x4C), 823 ADDRESS_PHONE(0x4D), 824 GEO_CENTROID_X(0x61), 825 GEO_CENTROID_Y(0x62), 826 GEO_CENTROID_Z(0x63), 827 GEO_BOUNDARY_TOP(0x64), 828 GEO_BOUNDARY_LEFT(0x65), 829 GEO_BOUNDARY_BOTTOM(0x66), 830 GEO_BOUNDARY_RIGHT(0x67), 831 GEO_BOUNDARY_FRONT(0x68), 832 GEO_BOUNDARY_REAR(0x69), 833 GEO_BOUNDARY_POLYGON(0x6A), 834 PHYSICAL_SIZE(0x71), 835 PHYSICAL_COLOR(0x72), 836 PHYSICAL_WEIGHT(0x73), 837 PHYSICAL_HEIGHT(0x74), 838 PHYSICAL_WIDTH(0x75), 839 PHYSICAL_DEPTH(0x76), 840 PHYSICAL_VOLUME(0x77), 841 PHYSICAL_DENSITY(0x78), 842 PERSON_FULL_NAME(0x82), 843 PERSON_FIRST_NAME(0x83), 844 PERSON_LAST_NAME(0x84), 845 PERSON_MIDDLE_NAME(0x85), 846 PERSON_DEMOGRAPHIC(0x86), 847 PERSON_CONTACT(0x87), 848 QTY_RANGE_LOW(0x91), 849 QTY_RANGE_HIGH(0x92), 850 FORMATTING_COLOR(0xA1), 851 FORMATTING_ORDER(0xA2), 852 FORMATTING_FONT(0xA3), 853 FORMATTING_FONT_EFFECTS(0xA4), 854 FORMATTING_FONT_SIZE(0xA5), 855 FORMATTING_SUB_TOTAL(0xA6), 856 DATE(0xB1), 857 DATE_START(0xB2), 858 DATE_ENDED(0xB3), 859 DATE_CANCELED(0xB4), 860 DATE_MODIFIED(0xB5), 861 DATE_DURATION(0xB6), 862 VERSION(0xC1); 863 864 private final int xmlaOrdinal; 865 private static final DictionaryImpl<ContentType> DICTIONARY = 866 DictionaryImpl.forClass(ContentType.class); 867 868 private ContentType(int xmlaOrdinal) { 869 this.xmlaOrdinal = xmlaOrdinal; 870 } 871 872 public String xmlaName() { 873 return "MD_PROPTYPE_" + name(); 874 } 875 876 public String getDescription() { 877 return null; 878 } 879 880 public int xmlaOrdinal() { 881 return xmlaOrdinal; 882 } 883 884 /** 885 * Per {@link org.olap4j.metadata.XmlaConstant}, returns a dictionary 886 * of all values of this enumeration. 887 * 888 * @return Dictionary of all values 889 */ 890 public static Dictionary<ContentType> getDictionary() { 891 return DICTIONARY; 892 } 893 } 894 } 895 896 // End Property.java