//////////////////////////////////////////////////////////////////////////////// // // Licensed to the Apache Software Foundation (ASF) under one or more // contributor license agreements. See the NOTICE file distributed with // this work for additional information regarding copyright ownership. // The ASF 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 mx.olap { import flash.utils.Dictionary; import mx.collections.ArrayCollection; import mx.collections.ICollectionView; import mx.collections.IList; import mx.collections.IViewCursor; import mx.core.mx_internal; import mx.resources.ResourceManager; use namespace mx_internal; //-------------------------------------- // Excluded APIs //-------------------------------------- [Exclude(name="dimension", kind="property")] //-------------------------------------- // metadata //-------------------------------------- [DefaultProperty("elements")] /** * The OLAPDimension class represents a dimension of an OLAP cube. * * @mxml *

* The <mx:OLAPDimension> tag inherits all of the tag attributes * of its superclass, and adds the following tag attributes: *

*
 *  <mx:OLAPDimension
 *    Properties
 *    attributes=""
 *    elements=""
 *    hierarchies=""
  *  />
 *
 *  @see mx.olap.IOLAPDimension
 *  
 *  @langversion 3.0
 *  @playerversion Flash 9
 *  @playerversion AIR 1.1
 *  @productversion Flex 3
 */
public class OLAPDimension extends OLAPElement implements IOLAPDimension
{
    include "../core/Version.as";
    
    //--------------------------------------------------------------------------
    //
    //  Constructor
    //
    //--------------------------------------------------------------------------
    
    /**
     *  Constructor
     *
     *  @param name The name of the OLAP dimension that includes the OLAP schema hierarchy of the element.
     *
     *  @param displayName The name of the OLAP dimension, as a String, which can be used for display. 
     *  
     *  @langversion 3.0
     *  @playerversion Flash 9
     *  @playerversion AIR 1.1
     *  @productversion Flex 3
     */
    public function OLAPDimension(name:String=null, displayName:String=null)
    {
        OLAPTrace.traceMsg("Creating dimension: " + name, OLAPTrace.TRACE_LEVEL_3);
        super(name, displayName);
    }
    
    //--------------------------------------------------------------------------
    //
    //  Variables
    //
    //--------------------------------------------------------------------------

    //map of attributes using name as the key
    private var attributeMap:Dictionary = new Dictionary(true);

    //map of hierarchies using name as the key
    private var _hierarchiesMap:Dictionary = new Dictionary(true);

    //--------------------------------------------------------------------------
    //
    //  Properties
    //
    //--------------------------------------------------------------------------
    
    //----------------------------------
    // attributes
    //----------------------------------
    
    private var _attributes:IList = new ArrayCollection;
    
    /**
     *  @inheritDoc
     *  
     *  @langversion 3.0
     *  @playerversion Flash 9
     *  @playerversion AIR 1.1
     *  @productversion Flex 3
     */
    public function get attributes():IList
    {
        return _attributes;
    }
    
    /**
     *  @private
     */
    public function set attributes(value:IList):void
    {
        _attributes = value;
        var n:int = value.length;
        for (var attrIndex:int = 0; attrIndex < n; ++attrIndex)
        {
            var attr:OLAPAttribute = value.getItemAt(attrIndex) as OLAPAttribute;
            attr.dimension = this;
            attributeMap[attr.name] = attr;
        }
    }
    
    //----------------------------------
    // cube
    //----------------------------------
    
    private var _cube:IOLAPCube;
    
    /**
     *  @inheritDoc
     *  
     *  @langversion 3.0
     *  @playerversion Flash 9
     *  @playerversion AIR 1.1
     *  @productversion Flex 3
     */
    public function get cube():IOLAPCube
    {
        return _cube;
    }
    
    /**
     *  @private
     */
    public function set cube(value:IOLAPCube):void
    {
        _cube = value;
    }
    
    //----------------------------------
    // dataProvider
    //----------------------------------

    mx_internal function get dataProvider():ICollectionView
    {
        return OLAPCube(cube).dataProvider;
    }
    
    //----------------------------------
    // defaultMember
    //----------------------------------
    
    /**
     *  @inheritDoc
     *  
     *  @langversion 3.0
     *  @playerversion Flash 9
     *  @playerversion AIR 1.1
     *  @productversion Flex 3
     */
    public function get defaultMember():IOLAPMember
    {
        // get the default hierarchy here
        if ((hierarchies.length + attributes.length) > 1)
        {
            var message:String = ResourceManager.getInstance().getString(
                        "olap", "multipleHierarchies");
            throw Error(message);
        }
        
        return hierarchies[0].defaultMember;
    }
    
    //----------------------------------
    // elements
    //----------------------------------
    
    /**
     *  Processes the input Array and initializes the attributes
     *  and hierarchies properties based on the elements of the Array.
     *  Attributes are represented in the Array by instances of the OLAPAttribute class, 
     *  and hierarchies are represented by instances of the OLAPHierarchy class.
     *
     *  

Use this property to define the attributes and hierarchies of a cube in a single Array.

* * @langversion 3.0 * @playerversion Flash 9 * @playerversion AIR 1.1 * @productversion Flex 3 */ public function set elements(value:Array):void { var attrs:ArrayCollection = new ArrayCollection(); var userHierarchies:ArrayCollection = new ArrayCollection(); for each (var element:Object in value) { if (element is OLAPAttribute) attrs.addItem(element); else if (element is OLAPHierarchy) userHierarchies.addItem(element); else OLAPTrace.traceMsg("Invalid element specified for dimension elements"); } attributes = attrs; hierarchies = userHierarchies; } //---------------------------------- // hierarchies //---------------------------------- private var _hierarchies:IList = new ArrayCollection; /** * @inheritDoc * * @langversion 3.0 * @playerversion Flash 9 * @playerversion AIR 1.1 * @productversion Flex 3 */ public function get hierarchies():IList { return _hierarchies; } /** * @private */ public function set hierarchies(value:IList):void { //limitation till we support multiple hierarchies. if (value.length > 1) { var message:String = ResourceManager.getInstance().getString( "olap", "multipleHierarchiesNotSupported", [name]); throw Error(message); } _hierarchies = value; for (var i:int = 0; i < value.length; ++i) { var h:OLAPHierarchy = value.getItemAt(i) as OLAPHierarchy; h.dimension = this; _hierarchiesMap[h.name] = h; } } //---------------------------------- // isMeasure //---------------------------------- private var _isMeasureDimension:Boolean = false; /** * @inheritDoc * * @langversion 3.0 * @playerversion Flash 9 * @playerversion AIR 1.1 * @productversion Flex 3 */ public function get isMeasure():Boolean { return _isMeasureDimension; } /** * @private */ mx_internal function setAsMeasure(value:Boolean):void { _isMeasureDimension = value; } //---------------------------------- // members //---------------------------------- /** * @inheritDoc * * @langversion 3.0 * @playerversion Flash 9 * @playerversion AIR 1.1 * @productversion Flex 3 */ public function get members():IList { var temp:Array = []; for (var i:int = 0; i < hierarchies.length; ++i) temp = temp.concat(hierarchies.getItemAt(i).members.toArray()); return new ArrayCollection(temp); } //-------------------------------------------------------------------------- // // Methods // //-------------------------------------------------------------------------- /** * @inheritDoc * * @langversion 3.0 * @playerversion Flash 9 * @playerversion AIR 1.1 * @productversion Flex 3 */ public function findHierarchy(name:String):IOLAPHierarchy { return _hierarchiesMap[name]; } /** * @inheritDoc * * @langversion 3.0 * @playerversion Flash 9 * @playerversion AIR 1.1 * @productversion Flex 3 */ public function findAttribute(name:String):IOLAPAttribute { return attributeMap[name]; } /** * @inheritDoc * * @langversion 3.0 * @playerversion Flash 9 * @playerversion AIR 1.1 * @productversion Flex 3 */ public function findMember(name:String):IOLAPMember { var member:IOLAPMember; var i:int = 0; var h:OLAPHierarchy; for (i = 0; i < attributes.length; ++i) { h = attributes.getItemAt(i) as OLAPHierarchy; member = h.findMember(name); if (member) break; } if (!member) { for (i = 0; i < hierarchies.length; ++i) { h = hierarchies.getItemAt(i) as OLAPHierarchy; member = h.findMember(name); if (member) break; } } return member; } /** * @private * Creates a hierarchy of the dimension. * * @param name The name of the hierarchy. * * @return An OLAPHierarchy instance that represents the new hierarchy. */ mx_internal function createHierarchy(name:String):OLAPHierarchy { var h:OLAPHierarchy = new OLAPHierarchy(name); h.dimension = this; _hierarchies.addItem(h); _hierarchiesMap[h.name] = h; return h; } /** * @private */ mx_internal function refresh():void { //if dimension is of measure type we have nothing to do. if (isMeasure) return; var temp:Object; var dataHandlers:Array =[]; var i:int = 0; var n:int = attributes.length; for (i = 0; i < n; ++i) { temp = attributes.getItemAt(i); dataHandlers.push(temp); } n = hierarchies.length; for (i = 0; i < n; ++i) { temp = hierarchies.getItemAt(i); temp.refresh(); dataHandlers.push(temp); } for (i = 0; i < n; ++i) { var h:OLAPHierarchy = hierarchies.getItemAt(i) as OLAPHierarchy; var levels:IList = h.levels; var m:int = levels.length; for (var j:int = 0; j < m; ++j) { var level:OLAPLevel = levels[j]; //levels doesn't include allLevel //if (level == h.allLevel) // continue; var a:OLAPAttribute = findAttribute(level.name) as OLAPAttribute; a.userHierarchy = level.hierarchy; a.userHierarchyLevel = level; } } // we need to refresh attributes here because we need the userHierarchy // userLevels to be set before refresh can happen. n = attributes.length; for (i = 0; i < n; ++i) { temp = attributes.getItemAt(i); temp.refresh(); } var iterator:IViewCursor = dataProvider.createCursor(); while (!iterator.afterLast) { var currentData:Object = iterator.current; for each (temp in dataHandlers) temp.processData(currentData); iterator.moveNext(); } } /** * @private */ mx_internal function addAttribute(name:String, dataField:String):IOLAPAttribute { var attrHierarchy:OLAPAttribute = attributeMap[name]; if (!attrHierarchy) { attrHierarchy = new OLAPAttribute(name); attrHierarchy.dataField = dataField; attrHierarchy.dimension = this; attributeMap[name] = attrHierarchy; _attributes.addItem(attrHierarchy); } return attrHierarchy; } } }