001/* 002// $Id: KeySegment.java 482 2012-01-05 23:27:27Z 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*/ 020package org.olap4j.mdx; 021 022import org.olap4j.impl.UnmodifiableArrayList; 023 024import java.util.List; 025 026/** 027 * Segment that represents a key or compound key. 028 * 029 * <p>Such a segment appears in an identifier with each component prefixed 030 * with "&". For example, in the identifier 031 * "<code>[Customer].[State].&[WA]&[USA]</code>", the third segment is 032 * a compound key whose parts are "{@code WA}" and "{@code USA}". 033 * 034 * @see org.olap4j.mdx.NameSegment 035 * 036 * @version $Id: KeySegment.java 482 2012-01-05 23:27:27Z jhyde $ 037 * @author jhyde 038 */ 039public class KeySegment implements IdentifierSegment { 040 private final List<NameSegment> subSegmentList; 041 042 /** 043 * Creates a KeySegment with one or more sub-segments. 044 * 045 * @param subSegments Array of sub-segments 046 */ 047 public KeySegment(NameSegment... subSegments) { 048 if (subSegments.length < 1) { 049 throw new IllegalArgumentException(); 050 } 051 this.subSegmentList = UnmodifiableArrayList.asCopyOf(subSegments); 052 } 053 054 /** 055 * Creates a KeySegment a list of sub-segments. 056 * 057 * @param subSegmentList List of sub-segments 058 */ 059 public KeySegment(List<NameSegment> subSegmentList) { 060 if (subSegmentList.size() < 1) { 061 throw new IllegalArgumentException(); 062 } 063 this.subSegmentList = 064 new UnmodifiableArrayList<NameSegment>( 065 subSegmentList.toArray( 066 new NameSegment[subSegmentList.size()])); 067 } 068 069 public String toString() { 070 final StringBuilder buf = new StringBuilder(); 071 toString(buf); 072 return buf.toString(); 073 } 074 075 public void toString(StringBuilder buf) { 076 for (IdentifierSegment segment : subSegmentList) { 077 buf.append('&'); 078 segment.toString(buf); 079 } 080 } 081 082 public ParseRegion getRegion() { 083 return IdentifierNode.sumSegmentRegions(subSegmentList); 084 } 085 086 public Quoting getQuoting() { 087 return Quoting.KEY; 088 } 089 090 public String getName() { 091 return null; 092 } 093 094 public List<NameSegment> getKeyParts() { 095 return subSegmentList; 096 } 097} 098 099// End KeySegment.java