обработка вложенного списка для генерации графических данных - PullRequest
0 голосов
/ 27 января 2012

Привет, у меня есть структура списка списков, подобная этой

udbList=[
      [132, 2011-11-28 00:00:00.0, Save Object], 
          [141, 2011-11-29 00:00:00.0, Save Object], 
          [133, 2011-11-29 00:00:00.0, Read Object], 
          [182, 2011-12-01 00:00:00.0, Save Object], 
          [119, 2011-12-02 00:00:00.0, Read Object], 
          [11, 2011-12-03 00:00:00.0, Write Object], 
          [12, 2011-12-04 00:00:00.0, Save Object]
          ]

Я создаю dataXML, который генерирует графики из этого.Тип графика - это многострочный график по дате, где каждая строка обозначает событие (последнее значение списка - сохранение / чтение / запись)

что-то вроде этого

dataXML+="<dataset seriesname='"<event type>"' color='""' lineThickness='2'>"
 udbList.each{
  dataXML += "<set value='"+it[0]+"'/>" //for that event type populate all count values (1st field in the list)
}

Я заполнил udbList, как мне написать логику для формирования dataXML

, наконец, для примера списка выше, у меня должен быть dataXML, подобный этому

def dataXML = "<graph caption='s' lineThickness='3' rotateNames='1'>" + "
       <categories>
         //Logic to iterate through udbList and insert all dates
        <category name='2011-11-28'/>
        <category name='2011-11-29'/>
        <category name='2011-12-01'/>  
        <category name='2011-12-02'/>
        <category name='2011-12-03'/>
        <category name='2011-12-04'/> 
     </categories>   
    <dataset seriesname='Save Object' color='""' lineThickness='2'>" +
    <set value='132'/>
    <set value='141'/>
    <set value='182'/>
    <set value='0'/>    // 0 because no value for event Save Object on 2011-12-02
    <set value='0'/>    // 0 because no value for event Save Object on 2011-12-03
    <set value='12'/>
    </series>
    <dataset seriesname='Read Object' color='""' lineThickness='2'>"
    <set value='0'/> 
    <set value='133'/>
    <set value='0'/> 
    <set value='119'/>
    <set value='0'/> 
    <set value='0'/> 
    </series>
    <dataset seriesname='Write Object' color='""' lineThickness='2'>"
    <set value='0'/> 
    <set value='0'/> 
    <set value='0'/> 
    <set value='0'/> 
    <set value='11'/>
    <set value='0'/> 
    </series>
</graph>

Поэтому мне нужно вставить '<set value='0'/>'когда нет результата для определенного типа события на дату Как я могу получить этот dataXML из моего списка списков?

Обновление: Если вы хотите, чтобы в вашем теге был 'set'XML с помощью MarkupBuilder вам нужно проверить эту проблему Grail MarkupBuilder выпуск Grails 5525

Ответы [ 2 ]

2 голосов
/ 27 января 2012

Вы можете использовать MarkupBuilder для этого:

def udbList = [
    [132, "2011-11-28 00:00:00.0", "Save Object"], 
    [141, "2011-11-29 00:00:00.0", "Save Object"], 
    [133, "2011-11-29 00:00:00.0", "Read Object"], 
    [182, "2011-12-01 00:00:00.0", "Save Object"], 
    [119, "2011-12-02 00:00:00.0", "Read Object"], 
    [11, "2011-12-03 00:00:00.0", "Write Object"], 
    [12, "2011-12-04 00:00:00.0", "Save Object"]
]

// Unique dates. 
def dates = udbList.collect { it[1] }.unique()

def xml = new groovy.xml.MarkupBuilder()

xml.graph(caption:'s', lineThickness:'3', rotateNames:'1') {
    categories {
        dates.each { date ->
            // Output dates in yyyy-MM-dd format.
            category(name: date.split()[0])
        }
    }
    series {
        // For each event type output a "dataset" tag and "set" tags for each 
        // date.
        ['Save Object', 'Read Object', 'Write Object'].each { type ->
            dataset(seriesname: type, color: '', lineThickness: '2') {
                dates.each { date ->
                    def val = udbList.find { it[1] == date && it[2] == type}
                    set(value: val ? val[0] : 0)                
                }
            }
        }
    }
}

println xml.toString()

Выход:

<graph caption='s' lineThickness='3' rotateNames='1'>
  <categories>
    <category name='2011-11-28' />
    <category name='2011-11-29' />
    <category name='2011-12-01' />
    <category name='2011-12-02' />
    <category name='2011-12-03' />
    <category name='2011-12-04' />
  </categories>
  <series>
    <dataset seriesname='Save Object' color='' lineThickness='2'>
      <set value='132' />
      <set value='141' />
      <set value='182' />
      <set value='0' />
      <set value='0' />
      <set value='12' />
    </dataset>
    <dataset seriesname='Read Object' color='' lineThickness='2'>
      <set value='0' />
      <set value='133' />
      <set value='0' />
      <set value='0' />
      <set value='119' />
      <set value='0' />
    </dataset>
    <dataset seriesname='Write Object' color='' lineThickness='2'>
      <set value='0' />
      <set value='0' />
      <set value='0' />
      <set value='0' />
      <set value='11' />
      <set value='0' />
    </dataset>
  </series>
</graph>

Обновление : Этопочти такой же, как и ответ Дейва Ньютона , единственное различие заключается в том, что он учитывает даты с несколькими типами событий.

2 голосов
/ 27 января 2012

Примерно (не самый эффективный, при условии, что данные фальшивые снова и что это дата, а не строка):

import groovy.xml.MarkupBuilder

l2 = udbList.sort { it[1] }
series = ['Save Object', 'Read Object', 'Write Object']

def writer = new StringWriter()
def xml = new MarkupBuilder(writer)
xml.graph(caption: 's', lineThickness: '3', rotateNames: '1') {
  categories {
    l2.each {
      category(name: "${it[1].format('yyyy-MM-dd')}")
    }
  }

  series.each { s ->
    dataset(seriesname: "${s}", color: '', lineThickness: '2') {
      l2.collect { s == it[2] ? it[0] : 0 }.each {
        set(value: "${it}")
      }
    }
  }
}

println writer.toString()

Выходы (при условии, что ваш пример вывода не означает </series>):

<graph caption='s' lineThickness='3' rotateNames='1'>
  <categories>
    <category name='2012-01-26' />
    <category name='2012-01-26' />
    <category name='2012-01-26' />
    <category name='2012-01-26' />
    <category name='2012-01-26' />
    <category name='2012-01-26' />
    <category name='2012-01-26' />
  </categories>
  <dataset seriesname='Save Object' color='' lineThickness='2'>
    <set value='182' />
    <set value='0' />
    <set value='141' />
    <set value='132' />
    <set value='0' />
    <set value='0' />
    <set value='12' />
  </dataset>
  <dataset seriesname='Read Object' color='' lineThickness='2'>
    <set value='0' />
    <set value='133' />
    <set value='0' />
    <set value='0' />
    <set value='119' />
    <set value='0' />
    <set value='0' />
  </dataset>
  <dataset seriesname='Write Object' color='' lineThickness='2'>
    <set value='0' />
    <set value='0' />
    <set value='0' />
    <set value='0' />
    <set value='0' />
    <set value='11' />
    <set value='0' />
  </dataset>
</graph>
...