首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ExtJS图的动态数据存储

ExtJS图的动态数据存储
EN

Stack Overflow用户
提问于 2011-12-31 19:57:28
回答 1查看 1.2K关注 0票数 2

我试图在服务器端使用JSP来执行可变数量的查询,并将所有查询的结果作为ExtJS线条图的单个JSON数据块输出。

查询次数是可变的,原因是每个查询表示线图上不同的序列(不同的行),而序列的数目因用户选择的线图而不同。

我使用hibernate,我的持久性类将每个查询数据返回为:List<Map<String, Object>> (每个Map代表一行)。

总是至少有一个系列(图上的一行,一个要执行的查询),所以我考虑设置它的方式如下:

1)运行初始查询并获得第一个系列

2)运行另一个查询,以检查图表上的任何其他系列

3)对于第二个查询中的每个“其他”系列,运行一个查询,该查询获取该系列的数据(行数相同),然后将数据合并到#1中作为另一列返回的第一个List<Map<String, Object>>中。该查询被设置为正确排序,只需在同一索引级别上合并即可。

4)以JSON的形式输出该列表。

我的问题是#3,我不知道如何合并数据.

到目前为止,我的情况如下:

代码语言:javascript
复制
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*/)
}

解决方案:

代码语言:javascript
复制
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() ? "" : "," ));
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-12-31 20:15:05

我不会把名单合并。我只需为每个查询创建一个外部列表,然后遍历外部列表并返回每个序列列表。您只需将外部列表创建为:

代码语言:javascript
复制
List outerList = new ArrayList();

我不担心指定外部列表的类型,因为它只会使它变得更加复杂,而不会带来什么好处。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8690259

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档