• Nenhum resultado encontrado

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.

Documentos relacionados