Yellowfin9.13からのカスタム日付関数の作成

# はじめに
Yellowfin9.13の新機能としてカスタム日付関数を作成することができるようになりました。wikiは[こちら](https://wiki.yellowfin.co.jp/pages/viewpage.action?pageId=104923145)。記事によると、このように書いてあります。
>日付期間は、例えば過去3ヶ月以内のデータのみを表示するようにデータをフィルタリングするなど、特定の時間範囲を通してレポートデータをフィルタリングする簡単な方法を提供します。また、Yellowfinでは、ユーザーが事前に定義した独自の日付期間を作成することもできます。

あまり良くわからないのですが、もともと実装されている今月や今年などの決まった期間で対象をしぼるだけでなく、自分でその範囲を指定できるようにJavaのクラスを拡張して使用できるということのようです。
これから先は会計年度の開始日から半年後をフィルタリングする例を紹介していきます。

## 前提条件
Yellowfin9.13以降をインストールした時の、/appserver/webapps/ROOT/WEB-INF/lib/にあるi4-mi.jarが必要です。これは、Javaのプロジェクトにおける追加のJarに含めるためです。
また、Java 8以降で作成することが条件の1つです。リンクは[こちら](https://wiki.yellowfin.co.jp/pages/viewpage.action?pageId=104923147)

## 実装に必要な関数
このカスタム日付関数を作成するには、以下のメソッドを実装する必要があります。リンクは[こちら](https://wiki.yellowfin.co.jp/pages/viewpage.action?pageId=104923167)
* public abstract String getName();
* public abstract String getUniqueID();
* public abstract FilterUnit getUnit();
* public abstract DatePeriodType getDatePeriodType();
* public abstract List<CalendarCommand> getLeftPredicate();
* public abstract List<CalendarCommand> getRightPredicate();
それぞれ見てみます。

### getName();
これはユーザー側に表示されるカスタム日付関数名です。
```java
@Override
public String getName() {
    return "First Half Year";
}
```
この場合はFirst Half Yearという値が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223443/22590bb1-f9a8-587d-3664-029c74a26277.png)

### getUniqueID();
このメソッドはYellowfin内部で使用されるユニークな名前なので他に作成するためには別の名前で作成してください。※この値はすべて大文字を使用してください。_アンダーバーは可能です。
```java
@Override
public String getUniqueID() {
    return "FIRST_HALF_YEAR";
}
```
### getFilterUnit();
このメソッドは、カスタム日付フィルターがどの期間にリンクされているかを返します。DAYにすると日付単位で計算が行われます。
```java
@Override
public FilterUnit getUnit() {
    return FilterUnit.DAY;
}
```
### getDatePeriodType();
このメソッドは適用される比較フィルターのタイプを伝えます。以下の例ではPREDEF_BETWEEN_DATESで日付ごとの比較をします。
```java
@Override
public DatePeriodType getDatePeriodType() {
    return DatePeriodType.PREDEF_BETWEEN_DATES;
}
```
### getLeftPredicate();
このメソッドは比較する際の始めの日付を定義します。この場合は会計年度の開始日を指します。
```java
@Override
public List<CalendarCommand> getLeftPredicate() {
    List<CalendarCommand> left = getBeginningOfToday();
    left.add(buildCommand(CalendarCommand.CmdType.SET_FIN_YEAR_START, 0));
    return left;
}
```
### getRightPredicate();
このメソッドは比較する際の終わりの日付を定義します。以下の例では会計年度の最終日から6ヶ月前を指定しています。
```java
@Override
public List<CalendarCommand> getLeftPredicate() {
    List<CalendarCommand> right = getEndOfToday();
    right.add(buildCommand(CalendarCommand.CmdType.SET_FIN_YEAR_END, 0));
    right.add(buildCommand(CalendarCommand.CmdType.ADD_AMOUNT, Calendar.MONTH, -6));
return right;
}
```
この場合だと**会計年度の開始日から半年後**をフィルターしていることになります。 
SQLを見ると半年でフィルターしていることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223443/373148ea-29f7-2765-fa42-73b4c0e08298.png)


## 全てのコード例
ここまでの必須メソッドを実装するとこのようになります。公式のコード例は[こちら](https://wiki.yellowfin.co.jp/pages/viewpage.action?pageId=104923173)
```java
import java.util.Calendar;
import java.util.List;
  
import com.hof.mi.util.CalendarCommand;
import com.hof.mi.interfaces.CustomDatePeriod;
  
public class FirstHalfYear extends CustomDatePeriod {
	  
	@Override
	public String getName() {
		return "First Half Year";
	}
	  
	@Override
	public String getUniqueID() {
		return "First_Half_Year";
	}
	  
	@Override
	public FilterUnit getUnit() {
		return FilterUnit.DAY;
	}
	  
	@Override
	public List<CalendarCommand> getLeftPredicate() {
		List<CalendarCommand> left = getBeginningOfToday();
		left.add(buildCommand(CalendarCommand.CmdType.SET_FIN_YEAR_START, 0));
	return left;
	}
	  
	@Override
	public List<CalendarCommand> getRightPredicate() {
		List<CalendarCommand> right = getEndOfToday();
		right.add(buildCommand(CalendarCommand.CmdType.SET_FIN_YEAR_END, 0));
		right.add(buildCommand(CalendarCommand.CmdType.ADD_AMOUNT, Calendar.MONTH, -6));
	return right;
	}
	  
	  
	public DatePeriodType getDatePeriodType() {
		return DatePeriodType.PREDEF_BETWEEN_DATES;
	}
	  
}
```

## パッケージ方法
プロジェクトをエクスポートする際に、JARファイルを指定して、そのまま、圧縮して.jarファイルでエクスポートします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223443/7bebfe2c-d7e0-e191-84af-a9de7c34efb7.png)
そして、Yellowfin上の管理→プラグイン管理でjarファイルをアップロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223443/c539fc63-3b7d-1a94-3d8f-68798964e6c9.png)

## 定数について
ここまで定数を大文字で記載してきましたが、詳細は[こちら](https://wiki.yellowfin.co.jp/pages/viewpage.action?pageId=104923176)をご覧ください。

# おわりに
カスタム日付関数の作成方法をご紹介してきましたが、新装されたこの機能を使うとYellowfin内部でもともと用意されているもの以上に柔軟に自分で期間指定して使用することができそうです。
ちなみに、会計年度の開始日の指定は管理→システム構成→地域のこの部分です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223443/adbd9517-ed8b-0e00-5a7b-4343d666df52.png)