Cumulativa máxima, calcule para cada registro pai
Pergunta
tem ninguém usou o functoid cumulativo máximo e problemas de desempenho observado?
Resumo
Se alguém quiser mapear o valor máximo de um campo que você pode usar a máxima cumulativa functoid.
Problema
Depois de termos utilizados por um tempo percebemos desempenho degradado em arquivos maiores.
Examinando o xslt percebe-se que o cálculo max é feito para cada registro looping ...
Pode-se mover o cálculo para o grande pai, e apontar as novas XSLT no caminho personalizado XSL, mas eu realmente gosto de manter a possibilidade de mapear na ferramenta de mapeamento.
Todas as sugestões?
Atenciosamente
Martin Traga
Solução
Ao remover a máxima cumulativa e adicionando 3 functoids script, fazendo o cálculo de outra maneira, o problema está resolvido. tempo Mapeamento diminuiu por um fator de 40.
11 Mb, 10 000 linhas, foi anteriormente mapeado em 200 minutos, agora é mapeado em 5 minutos.
Solução
Uma functoid script, "Molde inline XSLT chamada" com nenhuma entrada ou de saída, que contém a porção max () da biblioteca de EXSLT biblioteca de matemática encontrada aqui . Em vez de usar a biblioteca inteira eu descompactou o arquivo e "extraído" o modelo max ().
<xsl:template name="GetMax">
<xsl:param name="nodes" />
<xsl:choose>
<xsl:when test="not($nodes)">NaN</xsl:when>
<xsl:otherwise>
<xsl:for-each select="$nodes">
<xsl:sort data-type="number" order="descending" />
<xsl:if test="position() = 1">
<xsl:value-of select="number(.)" />
</xsl:if>
</xsl:for-each>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
Um script functoid, "modelo de chamada inline XSLT" sem entrada ou de saída, que contém uma variável que selecione pontos de atributos do modelo com o conjunto de nós para calcular
<xsl:variable name="var:MaxValueDate">
<xsl:call-template name ="GetMax">
<xsl:with-param name ="nodes" select="Root//Parent/ValueToCalculate" />
</xsl:call-template>
</xsl:variable>
Um functoid de script, "inline XSLT" com uma saída, usando a variável para preencher um elemento de saída com o seu valor.
<OutputElement>
<xsl:value-of select="$var:MaxValueDate" />
</OutputElement>
Voila!