Pesquisar

Anúncio
· Jun. 30

Obtenez une certification en tant que professionnel du développement

Vous avez au moins deux ans d'expérience en développement avec la plateforme de données InterSystems IRIS et des connaissances de base en InterSystems ObjectScript ?

Validez votre expertise avec le nouvel examen InterSystems IRIS Development Professional certification, notre premier examen de niveau professionnel !

Badge: InterSystems Certified. InterSystems IRIS Development Professional  

Que couvre l'examen ?

Bonnes pratiques en :

  • Architecture
  • Cycle de développement
  • Récupération de données
  • Code

Pourquoi obtenir une certification ?

👏 Obtenez une reconnaissance officielle de vos compétences et de votre expérience.
🚀 Boostez votre confiance… et votre carrière !

Comme le dit un client certifié InterSystems :

…la certification est une garantie solide que vous possédez l'étendue et la profondeur nécessaires pour opérer efficacement dans ces technologies.

Discussão (0)1
Entre ou crie uma conta para continuar
Discussão (2)1
Entre ou crie uma conta para continuar
Artigo
· Jun. 29 3min de leitura

Definições e Referências de Cubos de Analytics

Talvez isso já seja bem conhecido, mas quis compartilhar para ajudar.

 

Considere que você tem as seguintes definições de classes persistentes:

Uma classe Invoice (Fatura) com uma propriedade de referência para Provider (Prestador de serviço):

Class Sample.Invoice Extends (%Persistent, %Populate)
{
Parameter DSTIME = "AUTO";
Property InvoiceNumber As %Integer(MINVAL = 100000) [ Required ];
Property ServiceDate As %Date(MINVAL = "+$h-730") [ Required ];
Index InvoiceNumber On InvoiceNumber;
Property Provider As Sample.Provider [ Required ];
Index Provider On Provider [ Type = bitmap ];
/// Build some invoices, this will firstly create 100 Providers
/// <Example>
/// Set tSC=##class(Sample.Invoice).Build()
/// </example>
ClassMethod Build(pCount As %Integer = 100020, pInit As %Boolean = 0) As %Status
{
    #dim tSC 			As %Status=$$$OK
    #dim eException  	As %Exception.AbstractException
    try {
        If pInit {
            $$$THROWONERROR(tSC,##class(Sample.Provider).%KillExtent())
            $$$THROWONERROR(tSC,##class(Sample.Invoice).%KillExtent())
        }
        $$$THROWONERROR(tSC,##class(Sample.Provider).Populate(100))
        $$$THROWONERROR(tSC,##class(Sample.Invoice).Populate(pCount))
    }
    catch eException {
        Set tSC=eException.AsStatus()
    }
    Quit tSC
}
}

E a classe Provider

Class Sample.Provider Extends (%Persistent, %Populate)
{

Property Name As %String [ Required ];
Property NPI As %Integer(MAXVAL = 9000000000, MINVAL = 100000000) [ Required ];
}

Se você chamar o método Build da Sample.Invoice, poderá consultar isso via SQL:

SELECT
InvoiceNumber,Provider->Name, Provider As ProviderId,ServiceDate
FROM Sample.Invoice

E verá algo como:

O ponto que este artigo discute é: como criar uma dimensão no Provider.

O que eu descobri que funciona bem é seguir esse padrão:

O que isso faz:

  1. Define o identificador único da dimensão como o Id do Provider (que vem de Sample.Provider).
    Isso é importante porque é perfeitamente possível existir mais de um prestador com o nome SMITH, JOHN.
    Ao definir o nível da dimensão na propriedade Provider, estamos dizendo para construir a tabela de dimensão baseada em um Provider único.

Se olharmos na tabela de dimensão gerada, veremos:

  1. Define uma propriedade para o nível que:
    • Identifica a propriedade como Provider.Name
    • Define que o valor deve ser buscado em tempo de execução (Get value at runtime = Yes)
    • Usa esse valor como nome dos membros da dimensão (Use as member names = Yes)

Isso tem como efeito colateral gerar na tabela de dimensão a seguinte declaração de propriedade:

/// Dimension property: Name<br/>
/// Source: Provider.Name
Property Name As %String(COLLATION = "SQLUPPER(113)", MAXLEN = 2000) 
[ Calculated, 
SqlComputeCode = {Set {Name}=##class(Sample.BI.Cube.Invoice.Provider).%FetchName({Provider})}, SqlComputed ];

Com o método %FetchName assim:

/// Fetch the current value of %FetchName.<br/>
/// Generated by %DeepSee.Generator:%CreateStarTable.
ClassMethod %FetchName(pKey As %String) As %String
{
 // If we don't a value, show key as this is most likely the NULL substitute
 Set tValue=pKey
 &SQL(SELECT Name INTO :tValue FROM Sample.Provider WHERE %ID = :pKey)
 Quit tValue
}

 

O que isso significa?
Quando os membros da dimensão são recuperados, o que será exibido é o nome do Provider e não o seu Id.

No Analyzer, podemos ver:

Por que isso é importante?

  • Se o nome de um Provider for alterado na Sample.Provider, o cubo não precisa ser reconstruído ou sincronizado.
    Se tivermos centenas de milhões de faturas e o nome de um único Provider mudar, não queremos reconstruir ou sincronizar todo o cubo de Invoice só por isso.
  • A tabela de dimensão para Provider é baseada no Provider.Id, o que permite termos mais de um Provider com o mesmo nome na tabela de dimensões/cubo.
  • Se, em vez de definir a propriedade do nível da dimensão dessa forma, definirmos como Provider.Name, o identificador único da dimensão passa a ser o nome, o que faz com que todos os Providers com o mesmo nome sejam agrupados sob o mesmo nome.
  • E, se o nome de um Provider for alterado, somos obrigados a reconstruir o cubo.
Discussão (0)1
Entre ou crie uma conta para continuar