[JAVA] Erstellen Sie erweiterte Funktionen für Yellowfin

Zweck

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.

Einführung

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.

Verarbeitung von Zahlenwerten für die gesamte Spalte (zB geometrischer Durchschnitt)

image.png

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;
	}

Wenn Sie andere Spalten mit der ausgewählten Spalte vergleichen möchten oder wenn Sie andere Spalten einbeziehen möchten (z. B. Co-Dispersion)

image.png

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. image.png

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;
	}

Damit

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.

Recommended Posts

Erstellen Sie erweiterte Funktionen für Yellowfin
[Android] Validierung für Datumseingabe erstellen!
Erstellen Sie Ihre eigene Codierung für String.getBytes ()
Erstellen Sie einen fließenden Server zum Testen