Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
/*
* Available context bindings:
* COLUMNS List<DataColumn>
* ROWS Iterable<DataRow>
* OUT { append() }
* FORMATTER { format(row, col); formatValue(Object, col) }
* TRANSPOSED Boolean
* plus ALL_COLUMNS, TABLE, DIALECT
*
* where:
* DataRow { rowNumber(); first(); last(); data(): List<Object>; value(column): Object }
* DataColumn { columnNumber(), name() }
*/
import java.util.regex.Pattern
NEWLINE = System.getProperty("line.separator")
pattern = Pattern.compile("[^\\w\\d]")
def escapeTag(name) {
name = pattern.matcher(name).replaceAll("_")
return name.isEmpty() || !Character.isLetter(name.charAt(0)) ? "_$name" : name
}
def printRow = { values, rowTag, namer, valueToString ->
OUT.append("$NEWLINE<$rowTag")
values.eachWithIndex { it, index ->
def tag = namer(it, index)
def str = valueToString(it)
OUT.append(/ $tag="$str"/)
}
OUT.append("/>")
}
OUT.append(
"""<?xml version="1.0" encoding="UTF-8"?>
<dataset>""")
if (!TRANSPOSED) {
ROWS.each { row -> printRow(COLUMNS, TABLE.getName(), {it, _ -> escapeTag(it.name())}) { FORMATTER.format(row, it) } }
}
else {
def values = COLUMNS.collect { new ArrayList<String>() }
ROWS.each { row -> COLUMNS.eachWithIndex { col, i -> values[i].add(FORMATTER.format(row, col)) } }
values.eachWithIndex { it, index -> printRow(it, escapeTag(COLUMNS[index].name()), { _, i -> "row${i + 1}" }, { it }) }
}
OUT.append("""
</dataset>
""")
@brrshh
Copy link

brrshh commented Oct 14, 2020

Perfect work. But I got unexpected error in case of trying to export empty table. As I understand in line 40.

@ssmusoke
Copy link
Author

ssmusoke commented Oct 14, 2020

Perfect work. But I got unexpected error in case of trying to export empty table. As I understand in line 40.

@brrshh Unfortunately I leveraged the existing code, I would expect the error for an empty table, just add one row and it should just work

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment