<?xml version="1.0" encoding="utf-8"?>
<!--

  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.

-->
<mx:VBox 
    xmlns:fx="http://ns.adobe.com/mxml/2009"
    xmlns:s="library://ns.adobe.com/flex/spark"
    xmlns:mx="library://ns.adobe.com/flex/mx"     
    initialize="creationCompleteHandler()"
    >
	<fx:Script>
		<![CDATA[
			import mx.olap.OLAPMember;
			import mx.rpc.AsyncResponder;
			import mx.rpc.AsyncToken;
			import mx.messaging.messages.ErrorMessage;
			import mx.olap.OLAPQuery;
			import mx.olap.OLAPSet;
			import mx.olap.IOLAPQuery;
			import mx.olap.IOLAPQueryAxis;
			import mx.olap.IOLAPCube;
			import mx.olap.OLAPResult;
			import mx.events.CubeEvent;
			import mx.controls.Alert;
			import mx.collections.ArrayCollection;
			
			include "DataIntro.as"
			
			private function creationCompleteHandler():void {
				myMXMLCube.refresh();
			}
			private function getQuery(cube:IOLAPCube):IOLAPQuery {
				var query:OLAPQuery = new OLAPQuery;
				var om:OLAPMember;
				
				var rowQueryAxis:IOLAPQueryAxis = query.getAxis(OLAPQuery.ROW_AXIS);
				var productSet:OLAPSet = new OLAPSet;
				productSet.addElement(
					cube.findDimension("ProductDim").findAttribute("Product").findMember("ColdFusion"));
				productSet.addElement(
					cube.findDimension("ProductDim").findAttribute("Product").findMember("Flex"));
				
				om = OLAPMember(cube.findDimension("ProductDim").findAttribute("Product").defaultMember); 
				om.displayName = "Total";
				productSet.addElement(om);
				
				rowQueryAxis.addSet(productSet);
				
				var colQueryAxis:IOLAPQueryAxis = query.getAxis(OLAPQuery.COLUMN_AXIS);         
				var quarterSet:OLAPSet= new OLAPSet;
				quarterSet.addElement(
					cube.findDimension("TimeDim").findAttribute("Quarter").findMember("Q1"));
				quarterSet.addElement(
					cube.findDimension("TimeDim").findAttribute("Quarter").findMember("Q2"));
				
				om = OLAPMember(cube.findDimension("TimeDim").findAttribute("Quarter").defaultMember); 
				om.displayName = "Total";
				quarterSet.addElement(om);
				
				colQueryAxis.addSet(quarterSet);
				
				return query;       
			}

			private function runQuery():void {
				var cube:IOLAPCube = myMXMLCube;
				var query:IOLAPQuery = getQuery(cube);
				var token:AsyncToken = cube.execute(query);
				token.addResponder(new AsyncResponder(showResult, showFault));
			}
			
			private function showFault(error:ErrorMessage, token:Object):void {
				Alert.show(error.faultString);
			}
			
			private function showResult(result:Object, token:Object):void {
				if (!result) {
					Alert.show("No results from query.");
					return;
				}
				testODG.dataProvider= result as OLAPResult;            
			}        
		]]>
	</fx:Script>
	
	<fx:Declarations>
		<mx:OLAPCube name="FlatSchemaCube" dataProvider="{flatData}" id="myMXMLCube" complete="runQuery()">
		<mx:OLAPDimension name="CustomerDim">
			<mx:OLAPAttribute name="Customer" dataField="customer"/>
			<mx:OLAPHierarchy name="CustomerHier" 
							  hasAll="true">
				<mx:OLAPLevel attributeName="Customer"/>
			</mx:OLAPHierarchy>
		</mx:OLAPDimension>
		
		<mx:OLAPDimension name="ProductDim">
			<mx:OLAPAttribute name="Product" dataField="product"/>
			<mx:OLAPHierarchy name="ProductHier" 
							  hasAll="true">
				<mx:OLAPLevel attributeName="Product"/>
			</mx:OLAPHierarchy>
		</mx:OLAPDimension>
		
		<mx:OLAPDimension name="TimeDim">
			<mx:OLAPAttribute name="Year" dataField="year"/>
			<mx:OLAPAttribute name="Quarter" dataField="quarter"/>
			<mx:OLAPAttribute name="Month" dataField="month"/>
			<mx:OLAPHierarchy name="Time-Period" 
							  hasAll="true">
				<mx:OLAPLevel attributeName="Year"/>
				<mx:OLAPLevel attributeName="Quarter"/>
				<mx:OLAPLevel attributeName="Month"/>
			</mx:OLAPHierarchy> 
		</mx:OLAPDimension>
		
		<mx:OLAPDimension name="GeographyDim">  
			<mx:OLAPAttribute name="Country" dataField="country"/>
			<mx:OLAPAttribute name="Region" dataField="region"/>
			<mx:OLAPAttribute name="State" dataField="state"/>
			<mx:OLAPHierarchy name="Country-Region-State" 
							  hasAll="true">
				<mx:OLAPLevel attributeName="Country"/>
				<mx:OLAPLevel attributeName="Region"/>
				<mx:OLAPLevel attributeName="State"/>
			</mx:OLAPHierarchy> 
		</mx:OLAPDimension>
		
		<mx:OLAPMeasure name="Revenue" dataField="revenue" aggregator="SUM"/>
		<mx:OLAPMeasure name="Cost" dataField="cost" aggregator="SUM"/>
	</mx:OLAPCube>		
	</fx:Declarations>	

	<mx:OLAPDataGrid id="testODG"/>



</mx:VBox>
