Zusätzlich zu den ursprünglich in Yellowfin (BI-Tool) bereitgestellten Funktionen gibt es "erweiterte Funktionen", die Sie selbst erstellen und erweitern können. Ich habe es noch nie benutzt und ich habe es nicht angefasst, weil ich ein Programm schreiben muss, aber es gab eine Anfrage, den geometrischen Durchschnitt zu finden, und ich schrieb einen Artikel darüber, wie ich es gemacht habe. Persönlich, ehrlich gesagt, war es schwierig, nur das offizielle Wiki zu verwenden. Ich hoffe ich kann es schaffen.
Der grundlegende Weg, um mit der Entwicklung zu beginnen, ist die Verwendung von Eclipse, aber Grundlagen erweiterter Funktionen Wenn Sie beim Betrachten festlegen, wird die erforderliche Methode automatisch von AnalyticalFunction überschrieben und hinzugefügt, sodass Sie die darin enthaltenen Parameter festlegen und die erforderliche Verarbeitung in der applyAnalyticFunction-Methode beschreiben können.
Wenn es sich um eine Funktion handelt, die die Summe einer Spalte berechnet (kumulative Summe), finden Sie sie unter Erweiterte Funktion erstellen. Ich denke. In diesem Beispiel fügen Sie jeweils nur einen Datensatz aus der ausgewählten Spalte hinzu. Infolgedessen wird der Rückgabewert von applyAnalyticFunction an den Bericht zurückgegeben.
Auszug aus dem offiziellen Wiki ↓
simpleAdvancedFunction.java
import com.hof.mi.interfaces.AnalyticalFunction;
public class AccumulativeTotal
extends AnalyticalFunction{
private Double total = 0.0;
public String getName()
{
return "Accumulative Total";
}
public String getDescription()
{
return "Calculates the accumulative total for the selected field";
}
public String getCategory()
{
return "Analysis";
}
public String getColumnHeading(String colName)
{
return "Accumulative Total of " + colName;
}
public int getReturnType()
{
return TYPE_NUMERIC;
}
public boolean acceptsNativeType(int type)
{
return type == TYPE_NUMERIC;
}
public Object applyAnalyticFunction(int index, Object value) throws Exception
{
if (value == null) return null;
this.total += Double.valueOf(value.toString());
return this.total;
}
}
Konstanten wie TYPE_NUMERIC finden Sie im Anhang zu erweiterten Funktionen. Sowohl Integer-Werte als auch Konstanten sind in Ordnung.
Ich hatte nicht viele Details darüber, also habe ich es durch Herumtasten versucht, aber in Erweiterte Funktionen erstellen Verwenden Sie die gut geschriebene preAnalyticFunction-Methode. Wird verwendet, um Vorgänge im gesamten Dataset auszuführen. Es ist geschrieben, aber es ist schwer vorstellbar, weil das Beispiel nicht geschrieben ist. Es wird nur der Teil des Codes beschrieben, der zuvor hinzugefügt / geändert wurde.
Da das Objektarray der Spaltenwerte für jeden Datensatz im Argument selectedCol von preAnalyticFunction gespeichert ist, weisen Sie es zur Erläuterung dieser Summe nur zu Beginn zu und multiplizieren Sie sie, indem Sie mit cnt inkrementieren, wie oft der Vorgang wiederholt wurde. Ich werde. Am Ende wird die Anzahl der wiederholten Prozesse in Math.pow einfach zurückgegeben (angezeigt), wie dies in applyAnalyticFunction der Fall ist.
geometricMean.java
private int cnt = 0;//add
public Object applyAnalyticFunction(int index, Object value) throws Exception {//modify method
// TODO Auto-generated method stub
if (value == null) return null;
return this.total;
}
public void preAnalyticFunction(Object[] selectedCol){//add method
this.total=0.0;
for (Object value : selectedCol) {
if (value!=null) {
if(this.total==0.0){
this.total = Double.valueOf(value.toString());
} else {
this.total= this.total * Double.valueOf(value.toString());
}
cnt++;
}
}
this.total = Math.pow( this.total, (double)1/cnt);
}
public Object applyAnalyticFunction(int index, Object value) throws Exception {//modify
// TODO Auto-generated method stub
if (value == null) return null;
return this.total;
}
Zusätzlich zu Spalten, die erweiterte Funktionen verwenden, scheint es möglich zu sein, dass der Benutzer eine Spalte angibt und die Funktion ausführt, wenn Sie eine Spalte beeinflussen und vergleichen möchten. Dies war auch im Wiki schwer zu verstehen, aber getParameterValue durch Hinzufügen zum Parameter über die addParameter-Methode von setupParameters in Parameter setup. Sie können den eingestellten Parameter mit ("Eindeutiger Schlüssel") abrufen. Zu diesem Zeitpunkt können Sie eine beliebige Spalte auswählen, indem Sie den Parameter setDataType auf TYPE_FIELD (100) setzen.
Dies ist eine Beschreibung des Codes, aber dies beschreibt auch nur die Änderungen gegenüber dem Code des ersten Wikis. Rufen Sie das Objektarray des Werts (selectedCol) ab, auf den die erweiterte Funktion mit preAnalyticFunction angewendet wird, und das Objektarray des Spaltenwerts (inputColumn) des eindeutigen Schlüssels "FIELD_SELECTION", der zuvor mit getParameterValue (Element 1 im obigen Bild) erläutert wurde. Verwandeln Sie jeden in Double-Typ und fügen Sie ihn dem Array hinzu. Daher werden diese beiden Sequenzen an die Kovarianz übergeben, um den Kovarianzwert zu erhalten. Bei den Kovarianz- und Summenmethoden werden wir die Erklärung weglassen, da sie nur die Kovarianz und die Summe berechnen.
covariance.java
import java.util.ArrayList;//add
import java.util.List;//add
private List<Double> items1 = new ArrayList<>();//add
private List<Double> items2 = new ArrayList<>();//add
protected void setupParameters() {//add
Parameter p = new Parameter();
p.setUniqueKey("FIELD_SELECTION");
p.setDisplayName("Column");
p.setDescription("Compare this numeric field to the selected field");
p.setDataType(TYPE_FIELD);//100
p.setAcceptsFieldType(TYPE_NUMERIC, true);
p.setDisplayType(DISPLAY_SELECT);//6
addParameter(p);
}
public void preAnalyticFunction(Object[] selectedCol){//add
this.total=0.0;
Object [] inputColumn = (Object[]) getParameterValue("FIELD_SELECTION");
for (Object value : selectedCol) {
items1.add(Double.valueOf(value.toString()));
}
for (Object value : inputColumn) {
items2.add(Double.valueOf(value.toString()));
}
Double r = covariance(items1, items2);
this.total = r;
}
public Object applyAnalyticFunction(int index, Object value) throws Exception {//modify
// TODO Auto-generated method stub
if (value == null) return null;
return this.total;
}
public Double covariance(final List<Double> items1, final List<Double> items2) {//add
List<Double> items3 = new ArrayList<>();
int n = items1.size();
Double i1Mean = sum(items1)/n;
Double i2Mean = sum(items2)/n;
for (int i = 0; i < n; i++) {
items3.add((i1Mean - items1.get(i)) * (i2Mean - items2.get(i)));
}
Double i3Sum = sum(items3);
return i3Sum / n;
}
public Double sum(final List<Double> items) {//add
Double result = 0.0;
for (Double item : items) {
result += item;
}
return result;
}
Die Erklärung war etwas lang, aber durch das Erstellen einer erweiterten Funktion ist es etwas ärgerlich, sie in einem Bericht (mehrere reportFromReport usw.) auszudrücken, damit Sie schnell einen Wert erhalten, solange Sie ihn in Java schreiben können. Das Codieren nimmt viel Zeit in Anspruch, aber Sie können problemlos Prozesse ausführen, z. B. eine bestimmte Formel anwenden, die Sie immer intern verwenden, und die Beziehung zwischen zwei Spalten ermitteln.