3.3. Fases do Método Proposto
3.3.1. Extração de Dado Multidimensional
Esta fase tem por objetivo extrair informações do esquema de mapeamento entre o DW e o cubo de dados, de modo que sejam criadas, instanciadas e persistidas as entidades: Cubo, Medida, Nível e Vértice, mostradas no esquema conceitual da Figura 3.1. Isto é realizado pelo algoritmo extrator de dados multidimensional (Figura 3.2).
O algoritmo recebe como entrada o esquema de mapeamento (esquema) pelo qual as entidades serão criadas. Na linha 1, o procedimento ObterCubos é chamado para obter um conjunto de instâncias da entidade Cubo a partir de esquema, e armazená-lo na variável conjCubos. Na linha 3, cada instância i_cubo de conjCubos é persistida. Na linha 4, um conjunto de instâncias da entidade Medida que é definido em esquema para
i_cubo é lido e escrito na variável conjMedidas, e na linha 5, as instâncias de conjMedidas e seus correspondentes relacionamentos com i_cubo são salvos. Na linha
armazenadas na variável conjDimensões. Na linha 7, a variável todosConjNíveis é criada e instanciada para armazenar todos os conjuntos de níveis de cada dimensão do cubo i_cubo.
Uma vez armazenadas as informações sobre as entidades Cubo e Medida, o algoritmo realiza iterações sobre as dimensões encontradas para o cubo (i_cubo). Então, na linha 9, para cada dimensão i_dim de conjDimensões, é obtido um conjunto de hierarquias que é salvo em conjHierarquias. Em seguida, na linha 10, a variável
conjNíveisPorDim é criada e instanciada para armazenar o conjunto de níveis de dim.
Para cada hierarquia i_hierarquia de conjHierarquias, um conjunto de instâncias da entidade Nível é lido de esquema e armazenado na variável conjNíveis (linha 12). Para cada instância i_nível de conjNíveis são obtidos, na linha 14, os seus respectivos níveis que o precedem na hierarquia. Em seguida, cada nível i_nivel é armazenado, como também são armazenados o seu relacionamento com o cubo (i_cubo) e seus relacionamentos com os níveis precedentes (níveis_precedentes), na linha 15.
Até aqui, todas as informações sobre os níveis foram armazenadas, mas para se gerar todos os vértices do cubo é preciso ter um conjunto S que possui como elementos, conjuntos de níveis. Cada conjunto contido em S contém os níveis de cada dimensão do cubo. Por exemplo, considere que um cubo possua três dimensões Cliente, Produto e
Tempo. Então, o conjunto S terá 3 conjuntos: (1) possui todos os níveis da dimensão Cliente; (2) possui todos os níveis da dimensão Produto e (3) possui todos os níveis da
dimensão Tempo. No algoritmo de extração, o conjunto S é representado pela variável
todosConjNíveis e cada conjunto que compõe S é representado pela variável conjNíveisPorDim. Então, na linha 16, todos os níveis da dimensão (i_dim) são
adicionados a conjNíveisPorDim. Em seguida, na linha 17, todos os níveis da dimensão (i_dim), que estão armazenados em conjNíveisPorDim são adicionados a
todosConjNíveis.
Uma vez armazenadas as entidades Cubo, Medida, e Nível e tendo o conjunto de conjuntos de níveis do cubo (i_cubo) (denotado por todosConjNíveis), o algoritmo chama o procedimento ObterVertices (Figura 3.3) para gerar o conjunto de instâncias da entidade Vértice que representa todas as possíveis visões para o dado cubo de dados (i_cubo). Na linha 18, este conjunto de visões é atribuído à conjVértices. Finalmente, na linha 19, são gravadas todas as instâncias de conjVértices, como também para cada
instância de conjVértices, são armazenados o relacionamento da instância com i_cubo e os relacionamentos da instância com os níveis que a compõe.
Algoritmo 1: ExtratorDadoMultidimensional (esquema) Entrada: esquema de mapeamento entre DW e cubos OLAP Saída:
1 conjCubos ObterCubos(esquema); 2 PARA (i_cube: setOfCubes) FAÇA
3 GravarCubo(i_cubo);
4 conjMedidas ObterMedidas(i_cubo,esquema); 5 GravarMedidas(conjMedidas, i_cubo);
6 conjDimensões ObterDimensões(i_cubo,esquema); 7 todosConjNíveis
;8 PARA (i_dim : conjDimensões) FAÇA
9 conjHierarquias ObterHierarquias(i_dim,esquema); 10 conjNíveisPorDim
;11 PARA (i_hierarquia : conjHierarquias) FAÇA
12 conjNíveis ObterNíveis(i_hierarquia, esquema); 13 PARA (i_nível : conjNíveis) FAÇA
14 níveis_precedentes Precedentes(i_nível, i_hierarquia); 15 GravarNível(i_cubo, i_nível, níveis_precedentes);
16 conjNíveisPorDim conjNíveisPorDim conjNíveis; 17 todosConjNíveis todosConjNíveis conjNíveisPorDim; 18 conjVértices ObterVértices(i_cubo, todosConjNíveis); 19 GravarVértices(conjVértices, i_cubo);
Figura 3.2: Algoritmo Extrator de Dado Multidimensional
O procedimento ObterVértices (Figura 3.3) recebe como entrada uma instância de i_cubo e todas as instâncias da entidade Nível (indicado por todosConjNíveis). Na linha 1, conjVértices, que representa o conjunto de instâncias da entidade Vértice, é inicializada com um conjunto vazio. Seu objetivo é armazenar os vértices que irão ser gerados e retornados pelo algoritmo. Na linha 2, um procedimento é chamado para calcular o produto cartesiano entre todos os conjuntos de todosConjNíveis. Desta computação, uma coleção de conjuntos de instâncias da entidade Nível é retornada. Para gerar uma instância da entidade Vértice, as seguintes informações são necessárias: o tamanho da linha da visão (o atributo tamanho_da_linha da entidade Vértice), o número estimado de linhas da visão (o atributo número_de_linhas da entidade Vértice) e o conjunto de níveis que compõe o vértice (conjVértices).
O tamanho da linha (tamanho_linha) é dado pela soma de três valores: (1) o valor de retorno do procedimento CalcTamanhoLinha, que retorna o valor do atributo
tamanho_coluna da instância i_nível; (2) o valor de retorno do procedimento CalcTamanhoPrecedentes que retorna o somatório dos valores do atributo tamanho_da_coluna de cada nível que precede a instância i_nível; e (3) o valor de
retorno do procedimento CalcTamanhoMedidas que retorna o somatório dos valores do atributo tamanho_da_coluna de cada medida associada ao cubo (i_cubo) (linhas 8, 9 e 11).
Algoritmo 2: ObterVértices (i_cubo, todosConjNíveis)
Entrada: um cubo e um conjunto de conjuntos de níveis de cada dimensão Saída: um conjunto de vértices gerados
1 conjVértices
;2 combinacaoNíveis ProdutoCartesiano(todosConjNíveis); 3 PARA (conjNíveis: combinacaoNíveis) FAÇA
4 tamanho_linha 0; 5 numero_linhas 1;
6 PARA (i_nível: conjNíveis) FAÇA
7 numero_linhas numero_linhas * CalcNumLinhas(i_nível); 8 tamanho_linha tamanho_linha + CalcTamanhoLinha (i_nível); 9 tamanho_linha tamanho_linha + CalcTamanhoPrecedentes (i_nível); 10 num_estimado_linhas EstimarNumeroLinhas(numero_linhas);
11 tamanho_linha tamanho_linha + CalcTamanhoMedidas (i_cubo);
12 i_vértice CriarVértice(tamanho_linha, num_estimado_linhas, conjNíveis); 13 conjVértices conjVértices i_vértice;
14 RETORNE conjVértices;
Figura 3.3: Algoritmo Gerador de Vértices
Na linha 10, o num_estimado_linhas é obtido por meio de uma estimativa baseada no número de tuplas da tabela de fatos do cubo de dados i_cubo e no número de tuplas resultante do produtório entre o número de membros de cada nível contido em
conjNíveis. A estimativa utilizada foi definida em (SHUKLA, DESHPANDE e
NAUGHTON, 1998), e cuja fórmula é dada por , na qual é o número de tuplas da tabela de fatos e é o número máximo de linhas do vértice . O valor de é obtido pelo produto da multiplicação entre os elementos distintos (membros) de cada nível que compõem o vértice. Por exemplo, para o vértice (CPD) considere que existem para o nível C: 20 clientes, para o nível P: 30 produtos e para o nivel D: 100 dias. O número máximo de linhas do vértice é dado por
. Assim, cada instância i_vértice é criada e adicionada à
conjVértices na linha13. Finalmente na linha 14, o conjunto de instâncias de Vértice é
retornado.