/* // // Licensed to Benedikt Kämpgen under one or more contributor license // agreements. See the NOTICE file distributed with this work for // additional information regarding copyright ownership. // // Benedikt Kämpgen licenses this file to you under the Apache License, // Version 2.0 (the "License"); you may not use this file except in // compliance with the License. You may obtain a copy of the License at: // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. */ package org.olap4j.driver.olap4ld; import org.olap4j.OlapException; import org.olap4j.driver.olap4ld.Olap4ldDimension; import org.olap4j.driver.olap4ld.Olap4ldHierarchy; import org.olap4j.driver.olap4ld.Olap4ldLevel; import org.olap4j.driver.olap4ld.Olap4ldMember; import org.olap4j.driver.olap4ld.helper.Olap4ldLinkedDataUtil; import org.olap4j.impl.*; import org.olap4j.metadata.*; import org.semanticweb.yars.nx.Literal; import org.semanticweb.yars.nx.Node; import org.semanticweb.yars.nx.Variable; import java.util.ArrayList; import java.util.List; /** * Implementation of {@link org.olap4j.metadata.Hierarchy} * for XML/A providers. * * @author jhyde, bkaempgen * @version $Id: XmlaOlap4jHierarchy.java 464 2011-07-25 21:42:07Z jhyde $ * @since Dec 4, 2007 */ class Olap4ldHierarchy extends Olap4ldElement implements Hierarchy, Named { final Olap4ldDimension olap4jDimension; final NamedList<Olap4ldLevel> levels; private final boolean all; private final String defaultMemberUniqueName; Olap4ldHierarchy( Olap4ldDimension olap4jDimension, String uniqueName, String name, String caption, String description, boolean all, String defaultMemberUniqueName) throws OlapException { super(uniqueName, name, caption, description); assert olap4jDimension != null; this.olap4jDimension = olap4jDimension; this.all = all; this.defaultMemberUniqueName = defaultMemberUniqueName; String[] hierarchyRestrictions = { "CATALOG_NAME", olap4jDimension.olap4jCube.olap4jSchema.olap4jCatalog.getName(), "SCHEMA_NAME", olap4jDimension.olap4jCube.olap4jSchema.getName(), "CUBE_NAME", olap4jDimension.olap4jCube.getName(), "DIMENSION_UNIQUE_NAME", olap4jDimension.getUniqueName(), "HIERARCHY_UNIQUE_NAME", getUniqueName() }; this.levels = new DeferredNamedListImpl<Olap4ldLevel>( Olap4ldConnection.MetadataRequest.MDSCHEMA_LEVELS, new Olap4ldConnection.Context( olap4jDimension.olap4jCube.olap4jSchema.olap4jCatalog .olap4jDatabaseMetaData.olap4jConnection, olap4jDimension.olap4jCube.olap4jSchema.olap4jCatalog .olap4jDatabaseMetaData, olap4jDimension.olap4jCube.olap4jSchema.olap4jCatalog, olap4jDimension.olap4jCube.olap4jSchema, olap4jDimension.olap4jCube, olap4jDimension, this, null), new Olap4ldConnection.LevelHandler(olap4jDimension.olap4jCube), hierarchyRestrictions); //int pop = levels.size(); } public Dimension getDimension() { return olap4jDimension; } public NamedList<Level> getLevels() { Olap4ldUtil._log.config("Metadata object getLevels()..."); return Olap4jUtil.cast(levels); } public boolean hasAll() { return all; } public Member getDefaultMember() throws OlapException { if (defaultMemberUniqueName == null) { //return null; // Since every hierarchy needs a default member, we simply return the very first member return this.getLevels().get(0).getMembers().get(0); } return olap4jDimension.olap4jCube.getMetadataReader() .lookupMemberByUniqueName( defaultMemberUniqueName); } public NamedList<Member> getRootMembers() throws OlapException { final List<Olap4ldMember> memberList = olap4jDimension.olap4jCube.getMetadataReader().getLevelMembers( levels.get(0)); final NamedList<Olap4ldMember> list = new NamedListImpl<Olap4ldMember>(memberList); return Olap4jUtil.cast(list); } public boolean equals(Object obj) { return (obj instanceof Olap4ldHierarchy) && this.uniqueName.equals( ((Olap4ldHierarchy) obj).getUniqueName()); } @Deprecated public List<Node[]> transformMetadataObject2NxNodes(Cube cube) { List<Node[]> nodes = new ArrayList<Node[]>(); // Create header /* * ?CATALOG_NAME ?SCHEMA_NAME ?CUBE_NAME ?MEASURE_UNIQUE_NAME * ?MEASURE_NAME ?MEASURE_CAPTION ?DATA_TYPE ?MEASURE_IS_VISIBLE * ?MEASURE_AGGREGATOR ?EXPRESSION */ // Create header Node[] header = new Node[] { new Variable("?CATALOG_NAME"), new Variable("?SCHEMA_NAME"), new Variable("?CUBE_NAME"), new Variable("?DIMENSION_UNIQUE_NAME"), new Variable("?HIERARCHY_UNIQUE_NAME"), new Variable("?HIERARCHY_NAME"), new Variable("?HIERARCHY_CAPTION"), new Variable("?DESCRIPTION"), new Variable("?HIERARCHY_MAX_LEVEL_NUMBER")}; nodes.add(header); Node[] metadatanode = new Node[] { Olap4ldLinkedDataUtil .convertMDXtoURI(cube.getSchema().getCatalog().getName()), Olap4ldLinkedDataUtil .convertMDXtoURI(cube.getSchema().getName()), Olap4ldLinkedDataUtil .convertMDXtoURI(cube.getUniqueName()), Olap4ldLinkedDataUtil .convertMDXtoURI(this.getDimension().getUniqueName()), Olap4ldLinkedDataUtil .convertMDXtoURI(this.getUniqueName()), Olap4ldLinkedDataUtil .convertMDXtoURI(this.getName()), new Literal(this.getCaption()), new Literal(this.getDescription()), // Not exactly what HIERARCHY_MAX_LEVEL_NUMBER means, but should be sufficient. new Literal(this.getLevels().size()+"")}; nodes.add(metadatanode); return nodes; } } // End XmlaOlap4jHierarchy.java