読者です 読者をやめる 読者になる 読者になる

えいのうにっき

あたまのなかのデトックスを、不定期的に。主に Web 系技術ネタ。

Slim3+Ajax+jqPlotで、datastoreから取得したデータからグラフを動的に作成する

プログラム GAE/J

表記、少し苦労したのでメモ。
後から似たようなことをしようとされる方の参考になれば。
(自分用のプログラムからサンプル向けへの書き換えは行なっていませんので、適宜読み替えて下さい。)


まずはController。

import net.arnx.jsonic.JSON;


public class GetGraphDataController extends Controller {

    @Override
    protected Navigation run() throws Exception {

      this.response.setContentType("application/json; charset=UTF-8");

      //入力情報を取得
      String functionCode = this.request.getParameter("functionCode");
      String targetLoginID = this.request.getParameter("targetLoginID");


      if("1".equals(functionCode)){
          GetGraphDataForTotalPlayCountByUserService service = new GetGraphDataForTotalPlayCountByUserService();
          ArrayList<TotalPlayCountByUser> graphDatas = service.getData(targetLoginID);
          JSON.encode(graphDatas, this.response.getOutputStream());
      }
        return null;
    }
}

続いてHTMLのJavaScript

<script type="text/javascript">

  var data = new Array();
  var tick_data = new Array();

  $(document).ready(function(){
      $.ajax({
          type : 'GET',
          url : '/graph/GetGraphData',
          data : controll_data,
          cache : false,
          dataType : 'json',

          success : function(json) {
                $.each(json, function(i, TotalPlayCountByUser){
              	  data.push(TotalPlayCountByUser.playCount);
              	  tick_data.push(TotalPlayCountByUser.yyyymmdd);
                });

                $.jqplot(
                        'graph_TotalPlayCount',[data],
                        {
                          title: '総再生回数の推移グラフ',
                          seriesColors: [ "#f7d4d4", "#efa9a9", "#e77e7e", "#e05252", "#d82727"],
                          seriesDefaults: {
                            renderer: $.jqplot.BarRenderer,
                            pointLabels: { show: true, location: 'e', edgeTolerance: -15 },
                            rendererOptions: {
                              showDataLabels: true,
                              barWidth: 30,
                              varyBarColor: true
                            }
                          },
                          axes: {
                            xaxis: {
                              renderer: $.jqplot.CategoryAxisRenderer,
                              ticks: tick_data,
                              tickRenderer: $.jqplot.CanvasAxisTickRenderer,
                              tickOptions: {
                                angle: -30
                              }
                            }
                          }
                        }
                );
          },
          complete : function() {
            //通信完了
          }
      });
  });
</script>

参考程度に、serviceクラスも。

public class GetGraphDataForTotalPlayCountByUserService {

    static final UserMeta userMeta = UserMeta.get();

    @SuppressWarnings("static-method")
    public ArrayList<TotalPlayCountByUser> getData(String loginID){

        ArrayList<TotalPlayCountByUser> result = new ArrayList<TotalPlayCountByUser>();

        User user = Datastore.query(userMeta).filter(userMeta.loginId.equal(loginID)).asSingle();

        if(user == null){
            return result;
        }

        ArrayList<PlayCountData> datas = (ArrayList<PlayCountData>) user.getPlayCountDataRefs().getModelList();

        for(PlayCountData e : datas){
            StringBuffer yyyymmdd = new StringBuffer("20");
            yyyymmdd.append(e.getYyMMddHHmmss().substring(0, 2));
            yyyymmdd.append("/");
            yyyymmdd.append(e.getYyMMddHHmmss().substring(2, 4));
            yyyymmdd.append("/");
            yyyymmdd.append(e.getYyMMddHHmmss().substring(4, 6));
            result.add(new TotalPlayCountByUser(yyyymmdd.toString(), e.getTotalPlayCount()));
        }
        return result;
    }
}

この結果、↓のようなグラフが出力できます。