2011-12-31 9 views
2

サーバー側でJSPを使用して、さまざまなクエリを実行し、そのすべての結果をExtJS折れ線グラフのJSONデータの単一ブロックとして出力しようとしています。ExtJSチャートの動的データストア

クエリの数が可変である理由は、それぞれが線グラフ上で異なる系列(異なる線)を表し、系列の数がユーザが選択する線グラフによって異なるためです。

私はhibernateを使用しています。私の永続性クラスは、各クエリデータをList<Map<String, Object>>(各マップは1行を表します)として返します。

あり、常に少なくとも1シリーズ(グラフ上の1行、実行する1つのクエリー)となりますので、私はこの設定を考えていた方法は次のとおりです。

1)は、最初のクエリの実行を持っていますデータを取得するクエリを実行する2番目のクエリで検出された各「その他」シリーズのために)グラフ

3にする必要があり、他のシリーズをチェックするために別のクエリを実行し、最初のシリーズ

2)を取得その系列(同じ行数)のデータをマージし、そのデータを最初のList<Map<String, Object>>にマージします。これは、#1で別の列として戻されました。クエリは、適切に並べ替えるように設定されているだけで、同じインデックスレベルでマージする必要があります。

4)そのリストをJSONとして出力します。

私の問題は#3で、私はデータのマージについてどうやって行くのか分かりません。

は、ここで私がこれまで持っているものです。

GenericSelectCommand graphData = new GenericSelectCommand(graphDataQuery); 
GenericSelectCommand backSeriesData = new GenericSelectCommand(backSeriesQuery); 

List<Map<String, Object>> graphDataList; 
List<Map<String, Object>> backSeriesList; 

try 
{ 
    Persistor myPersistor = new Persistor(); 

    // 1) GET THE INITIAL LINE CHART SERIES 
    myPersistor.executeTransact(graphData); 
    graphDataList = graphData.getRows(); 

    // 2) LOOK FOR ANY ADDITIONAL SERIES THAT SHOULD BE ON THE LINE CHART 
    myPersistor.executeTransact(backSeriesData); 
    backSeriesList = backSeriesData.getRows(); 

    // 3) FOR EACH ADDITIONAL SERIES FOUND, RUN A QUERY AND APPEND THE DATA TO THE INITIAL LINE CHART SERIES (graphDataList) 
    for (int i = 0; i < backSeriesList.size(); i++) 
    { 
     Map<String, Object> backSeriesBean = backSeriesList.get(i); 

     // THIS QUERY RETURNS ONE COLUMN OF INT VALUES (THE LINE CHART DATA) WITH THE EXACT SAME NUMBER OF ROWS AS THE INITIAL LINE CHART SERIES (graphDataList) 
     String backDataQuery = "exec runQuery 'getBackData', '" + backSeriesBean.get("series_id") + "'"; 

     GenericSelectCommand backData = new GenericSelectCommand(backDataQuery); 
     myPersistor.executeTransact(backData); 
     List<Map<String, Object>> backDataList = backData.getRows(); 

     // FOR EACH RECORD IN THE BACK DATA (Map<String, Object>) 
     for (int i = 0; i < backDataList.size(); i++) 
     { 
      Map<String, Object> backDataBean = backDataList.get(i); 
      // HOW DO I ADD IT TO THE RECORD AT THE SAME INDEX LEVEL IN graphDataList (List<Map<String, Object>>) 
     } 

    } 


} 
catch (Throwable e) 
{ 
    System.err.println("Error: "); 
    System.err.println(e.getCause()); 
} 
finally 
{ 
    myPersistor.closeSession(); 
} 

// 4) RETURN THE DATA AS JSON NOW THAT IT IS MERGED 
for (int i = 0; i < graphDataList.size(); i++) 
{ 
    Map<String, Object> graphDataBean = graphDataList.get(i); 
    out.println(/*JSON FORMAT + graphDataBean.get('data') + JSON FORMAT*/) 
} 

SOLUTION:

GenericSelectCommand graphData = new GenericSelectCommand(graphDataQuery); 
GenericSelectCommand backSeries = new GenericSelectCommand(backSeriesQuery); 

List<Map<String, Object>> graphDataList = Collections.emptyList(); 
List<Map<String, Object>> backSeriesList = Collections.emptyList(); 
List backDataListArray = new ArrayList(); 

try 
{ 

    // GET THE INITIAL LINE CHART SERIES 
    Persistor.instance().executeTransact(graphData); 
    graphDataList = graphData.getRows(); 

    // LOOK FOR ANY ADDITIONAL SERIES THAT SHOULD BE ON THE LINE CHART 
    Persistor.instance().executeTransact(backSeries); 
    backSeriesList = backSeries.getRows(); 

    // FOR EACH ADDITIONAL SERIES FOUND, RUN THE QUERY AND ADD IT TO backDataListArray 
    for (int i = 0; i < backSeriesList.size(); i++) 
    { 
     Map<String, Object> backSeriesBean = backSeriesList.get(i); 

     String backDataQuery = "exec runQuery 'getBackData', " + backSeriesBean.get("series_id"); 
     GenericSelectCommand backData = new GenericSelectCommand(backDataQuery); 
     Persistor.instance().executeTransact(backData); 
     List<Map<String, Object>> backDataList = backData.getRows(); 
     backDataListArray.add(backDataList); 
    } 
} 
catch (Throwable e) 
{ 
    System.err.println("Error: "); 
    System.err.println(e.getCause()); 
} 
finally 
{ 
    Persistor.instance().closeSession(); 
} 

// FOR EACH RECORD IN THE ORIGINAL QUERY, WRITE THE JSON STRING 
for (int i = 0; i < graphDataList.size(); i++) 
{ 

    StringBuilder backDataString = new StringBuilder(); 

    // BUILD THE BACK DATA STRING (IF THERE IS ANY) 
    for (int j = 0; j < backDataListArray.size(); j++) 
    { 
     List<Map<String, Object>> backDataList = (List<Map<String, Object>>) backDataListArray.get(j); 
     Map<String, Object> backDataBean = backDataList.get(i); 
     Map<String, Object> backSeriesBean = backSeriesList.get(j); 

     backDataString.append(backSeriesBean.get("the_series") + ": " + backDataBean.get("the_count") + ", "); 
    } 

    Map<String, Object> graphDataBean = graphDataList.get(i); 

    out.println("{the_quota: " + graphDataBean.get("the_quota") + ", " + "count_pt_year: " + graphDataBean.get("count_pt_year") + ", " + backDataString + "date_string: '" + graphDataBean.get("date_string") + "'}" + (i + 1 == graphDataList.size() ? "" : ",")); 
} 

答えて

3

私はリストをマージしません。私はちょうど各クエリの外側のリストを作成し、外側のリストを通過し、各シリーズのリストを返すだろう。それはほんの少しの利益のために、それはより複雑になりますように私は外側のリストの型を指定する心配はないでしょう

List outerList = new ArrayList(); 

:あなただけのように、外側のリストを作成することができます。

+0

ありがとうフランシス、それをまっすぐにした – Geronimo

関連する問題