Optimize CSV export value string conversion.

This commit is contained in:
Fabian Märki
2017-02-20 08:47:08 +01:00
parent 0498441024
commit a985cdcc8d
2 changed files with 30 additions and 17 deletions

View File

@ -1,9 +1,10 @@
package ch.psi.daq.queryrest.response.csv; package ch.psi.daq.queryrest.response.csv;
import java.lang.reflect.Array;
import java.util.function.Function; import java.util.function.Function;
import ch.psi.daq.common.util.Arrays;
import ch.psi.daq.domain.DataEvent; import ch.psi.daq.domain.DataEvent;
import ch.psi.data.collection.PrimitiveList;
public class QueryFieldStringifyer implements Function<DataEvent, String> { public class QueryFieldStringifyer implements Function<DataEvent, String> {
public static final String OPEN_BRACKET = "["; public static final String OPEN_BRACKET = "[";
@ -19,6 +20,7 @@ public class QueryFieldStringifyer implements Function<DataEvent, String> {
this.arraySeparator = arraySeparator; this.arraySeparator = arraySeparator;
} }
@SuppressWarnings("rawtypes")
@Override @Override
public String apply(DataEvent event) { public String apply(DataEvent event) {
if (event == null) { if (event == null) {
@ -28,24 +30,35 @@ public class QueryFieldStringifyer implements Function<DataEvent, String> {
Object value = accessor.apply(event); Object value = accessor.apply(event);
if (value == null) { if (value == null) {
return nonValue; return nonValue;
} else if (value instanceof PrimitiveList) {
return toString((PrimitiveList) value, arraySeparator);
} else if (value.getClass().isArray()) { } else if (value.getClass().isArray()) {
StringBuilder buf = new StringBuilder(); return Arrays.toString(value, arraySeparator);
int length = Array.getLength(value);
buf.append(OPEN_BRACKET);
for (int i = 0; i < length;) {
buf.append(Array.get(value, i));
++i;
if (i < length) {
buf.append(arraySeparator);
}
}
buf.append(CLOSE_BRACKET);
return buf.toString();
} else { } else {
return value.toString(); return value.toString();
} }
} }
public static String toString(PrimitiveList<?> value, String arraySeparator) {
int size = value.size();
if (size < 1) {
return Arrays.NULL_STRING;
} else if (size == 1) {
// scalar
return value.getAsString(0);
} else {
int iMax = size - 1;
if (iMax == -1)
return Arrays.EMPTY_ARRAY;
StringBuilder b = new StringBuilder();
b.append(OPEN_BRACKET);
for (int i = 0;; i++) {
b.append(value.getAsString(i));
if (i == iMax)
return b.append(CLOSE_BRACKET).toString();
b.append(arraySeparator);
}
}
}
} }

View File

@ -492,7 +492,7 @@ public class CSVQueryRestControllerTest extends AbstractDaqRestTest {
assertEquals("" + TimeUtils.getMillis(TestTimeUtils.getTimeFromPulseId(pulse)), record.get(column++)); assertEquals("" + TimeUtils.getMillis(TestTimeUtils.getTimeFromPulseId(pulse)), record.get(column++));
assertEquals("[8]", record.get(column++)); assertEquals("[8]", record.get(column++));
assertEquals("1", record.get(column++)); assertEquals("1", record.get(column++));
assertTrue(record.get(column).startsWith("[")); assertTrue(record.get(column).startsWith("["+pulse+","));
assertTrue(record.get(column++).endsWith("]")); assertTrue(record.get(column++).endsWith("]"));
} }
++pulse; ++pulse;