Showing posts with label creating. Show all posts
Showing posts with label creating. Show all posts

Tuesday, February 17, 2015

Creating Cubes with Oracle OLTP databases A test scenario with synonims

This is article is written based on below queries before I explore it.

1) Is it mandatory to have Star Schema based warehouse to create Cubes ?
2) In oracle if you have multiple users(lets say multiple schemes).. Is it possible t design a simple CUBE dimension from schema A of a table and measure from schema B of another table ?

The answer is , NO & Yes.

All the organizations may not maintain complete data ware housing solutions and run their transactional database using normalized OLTP models.

It is not mandatory to have a star schema based ware house to create OLAP cube to analyze your data but you can also use OLTP databases.


The new things I found while demonstrating a simple cube are..

1) Connecting to oracle database.
2) Fetching all the tables of all schemas.
3) Synonyms of a particular schema

 You will find a lot of time taking to load the database into PSW tool once you connected to a schema.. Using FILTER_SCHEMA_LIST at Options section of the database dialogue will take the control to load only specified schema tables.

By default the PSW engine assumes to load all the tables in all the schemes.


A scenario of Dimensions and measures.

Suppose in a case, if you have a measure coming from table defined in SchemaA, measure coming from a table defined in SchemaB... in that case while giving tables for fact and dimension tables, the synonyms will not appear in drop down boxes... 

You need to hard code the tables names ... Of course your dimensions & measures will be in X with red color, it will not affect your definition of hard coded table names.

Save the schema and publish it to the server... have tested it with Saiku plug-in ad-hoc editor and worked nicely.


Thank you.

References :
1) http://jira.pentaho.com/browse/PSW-135

2) http://forums.pentaho.com/showthread.php?162540-OLTP-tables-VS-RDBMS-tables-Designing-OLAP-cubes-Peformance-factors&p=374714#post374714

3) http://forums.pentaho.com/showthread.php?157997-Schema-Workbench-freeze-after-establishing-a-connection-in-db








 
Read more »

Sunday, February 1, 2015

Creating EasyKeyboard class Part 5

Today well add the ability to add hold event listeners using key names, and the ability to remove all listeners at once.

Go to EasyKeyboard.as code and add a new function called addEasyHoldListener(), add 2 parameters to it - keyName and handler.

Loop through all keyLabels like we do in addEasyListener() and check if the specified key name matches any of those elements. If so, remember the id of the key name in the array (this will be the key code). If no matches were found, throw an error. Call addHoldListener() with the calculated keyCode and the user-specified handler values.

/**
* Add hold listener for a single key using key string value.
* @paramkeyName String name of the key.
* @paramhandler Function to execute while the key is held every frame.
*/

public function addEasyHoldListener(keyName:String, handler:Function):void {
var code:int = -1;
for (var i:int = 0; i < keyLabels.length; i++) {
if (keyLabels[i] == keyName) {
code = i;
break;
}
}
if (code == -1) {
throw new Error(Incorrect key string value specified - no " + keyName + " key found.);
return;
}
addHoldListener(code, handler);
}

And now its possible to easily add key holding listeners using key names, for example:

keyboard = new EasyKeyboard(stage);
keyboard.addEasyHoldListener("A", function() { trace("A is being held!"); } );

A time might come when the developer would want to remove all the listeners. Lets create a separate function for that, call it kill(). Simply remove the 3 event listeners in it:

/**
* Call this before nullifying the class instance to remove all the listeners.
*/

public function kill():void {
st.removeEventListener(KeyboardEvent.KEY_DOWN, kDown);
st.removeEventListener(KeyboardEvent.KEY_UP, kUp);
st.addEventListener(Event.ENTER_FRAME, frame);
}

Full EasyKeyboard.as code:

package com.kircode.EasyKeyboard 
{
import flash.display.Stage;
import flash.events.Event;
import flash.events.KeyboardEvent;

/**
* Utility for easy keyboard listener management.
* @author Kirill Poletaev
*/
public class EasyKeyboard
{
public var listeners:Array = [];
private var keyLabels:Array = ["0","1","2","3","4","5","6","7","Backspace","Tab","10","11","Center","Enter","14","15","Shift","Control","Alt","Pause","Caps Lock","21","22","23","24","25","26","27","28","29","30","31","Space","Page Up","Page Down","End","Home","Left","Up","Right","Down","41","42","43","44","Insert","Delete","47","0","1","2","3","4","5","6","7","8","9","58","59","60","61","62","63","64","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","Windows","Windows","Menu","94","95","Num 0","Num 1","Num 2","Num 3","Num 4","Num 5","Num 6","Num 7","Num 8","Num 9","Num *","Num +","108","Num -","Num .","Num /","F1","F2","F3","F4","F5","F6","F7","F8","F9","F10","F11","F12","124","125","126","127","128","129","130","131","132","133","134","135","136","137","138","139","140","141","142","143","Num Lock","Scroll Lock","146","147","148","149","150","151","152","153","154","155","156","157","158","159","160","161","162","163","164","165","166","167","168","169","170","171","172","173","174","175","176","177","178","179","180","181","182","183","184","185",";","+",",","-",".","/","~","193","194","195","196","197","198","199","200","201","202","203","204","205","206","207","208","209","210","211","212","213","214","215","216","217","218","[","\","]","","223","224","225","226","227","228","229","230","231","232","233","234","235","236","237","238","239","240","241","242","243","244","245","246","247","248","249","250","251","252","253","254","255"];
private var st:Stage;

public function EasyKeyboard(stage:Stage)
{
stage.addEventListener(KeyboardEvent.KEY_DOWN, kDown);
stage.addEventListener(KeyboardEvent.KEY_UP, kUp);
stage.addEventListener(Event.ENTER_FRAME, frame);
st = stage;
}

private function frame(evt:Event):void {
for (var i:int = 0; i < listeners.length; i++) {
if (listeners[i] is HoldListener && listeners[i].flag) {
listeners[i].handler.call();
}
}
}

/**
* Call this before nullifying the class instance to remove all the listeners.
*/

public function kill():void {
st.removeEventListener(KeyboardEvent.KEY_DOWN, kDown);
st.removeEventListener(KeyboardEvent.KEY_UP, kUp);
st.addEventListener(Event.ENTER_FRAME, frame);
}

/**
* Add event listener for a single key using a keycode.
* @paramkeyCode Key code of the key.
* @paramhandlerDown Function to be called when the key is pressed down.
* @paramhandlerUp Function to be called when the key is released.
* @paramalt Used in combination with the alt key.
* @paramctrl Used in combination with the ctrl key.
* @paramshift Used in combination with the shift key.
*/

public function addListener(keyCode:int, handlerDown:Function = null, handlerUp:Function = null, alt:Boolean = false, ctrl:Boolean = false, shift:Boolean = false):void {
listeners.push(new KeyListener(keyCode, handlerDown, handlerUp, alt, ctrl, shift));
}

/**
* Add event listener for a single key using a keycode.
* @paramkeyCode Key code of the key.
* @paramhandler Function to execute while the key is held every frame.
*/

public function addHoldListener(keyCode:int, handler:Function):void {
listeners.push(new HoldListener(keyCode, handler, false));
}

/**
* Add event listener for a single key using key string value.
* @paramkeyName String name of the key.
* @paramhandlerDown Function to be called when the key is pressed down.
* @paramhandlerUp Function to be called when the key is released.
* @paramalt Used in combination with the alt key.
* @paramctrl Used in combination with the ctrl key.
* @paramshift Used in combination with the shift key.
*/

public function addEasyListener(keyName:String, handlerDown:Function = null, handlerUp:Function = null, alt:Boolean = false, ctrl:Boolean = false, shift:Boolean = false):void {
var code:int = -1;
for (var i:int = 0; i < keyLabels.length; i++) {
if (keyLabels[i] == keyName) {
code = i;
break;
}
}
if (code == -1) {
throw new Error(Incorrect key string value specified - no " + keyName + " key found.);
return;
}
addListener(code, handlerDown, handlerUp, alt, ctrl, shift);
}

/**
* Add hold listener for a single key using key string value.
* @paramkeyName String name of the key.
* @paramhandler Function to execute while the key is held every frame.
*/

public function addEasyHoldListener(keyName:String, handler:Function):void {
var code:int = -1;
for (var i:int = 0; i < keyLabels.length; i++) {
if (keyLabels[i] == keyName) {
code = i;
break;
}
}
if (code == -1) {
throw new Error(Incorrect key string value specified - no " + keyName + " key found.);
return;
}
addHoldListener(code, handler);
}

private function kDown(evt:KeyboardEvent):void {
for (var i:int = 0; i < listeners.length; i++) {
if (evt.keyCode == listeners[i].keyCode && listeners[i] is KeyListener && evt.altKey == listeners[i].alt && evt.ctrlKey == listeners[i].ctrl && evt.shiftKey == listeners[i].shift) {
if (listeners[i].handlerD) listeners[i].handlerD.call();
}
if (evt.keyCode == listeners[i].keyCode && listeners[i] is HoldListener) {
listeners[i].flag = true;
}
}
}

private function kUp(evt:KeyboardEvent):void {
for (var i:int = 0; i < listeners.length; i++) {
if (evt.keyCode == listeners[i].keyCode && listeners[i] is KeyListener && evt.altKey == listeners[i].alt && evt.ctrlKey == listeners[i].ctrl && evt.shiftKey == listeners[i].shift) {
if (listeners[i].handlerU) listeners[i].handlerU.call();
}
if (evt.keyCode == listeners[i].keyCode && listeners[i] is HoldListener) {
listeners[i].flag = false;
}
}
}

}

}

Thanks for reading!
Read more »