diff --git a/oap-formats/oap-logstream/oap-logstream/src/main/java/oap/logstream/MemoryLoggerBackend.java b/oap-formats/oap-logstream/oap-logstream/src/main/java/oap/logstream/MemoryLoggerBackend.java index 1d03ee776..2621414c7 100644 --- a/oap-formats/oap-logstream/oap-logstream/src/main/java/oap/logstream/MemoryLoggerBackend.java +++ b/oap-formats/oap-logstream/oap-logstream/src/main/java/oap/logstream/MemoryLoggerBackend.java @@ -24,6 +24,8 @@ package oap.logstream; +import com.google.common.base.Preconditions; +import it.unimi.dsi.fastutil.ints.IntArrayList; import lombok.SneakyThrows; import oap.io.Closeables; import oap.logstream.LogStreamProtocol.ProtocolVersion; @@ -48,7 +50,7 @@ public class MemoryLoggerBackend extends AbstractLoggerBackend { @Override public synchronized String log( ProtocolVersion version, String hostName, String filePreffix, Map properties, String logType, - String[] headers, byte[][] types, byte[] buffer, int offset, int length ) { + String[] headers, byte[][] types, byte[] buffer, int offset, int length ) { LogId logId = new LogId( filePreffix, logType, hostName, properties, headers, types ); outputs .computeIfAbsent( logId, fn -> new ByteArrayOutputStream() ) @@ -133,19 +135,31 @@ public List> asRowBinary( Predicate filter, String... header for( LogId id : outputs.keySet() ) { if( filter.test( id ) ) { + IntArrayList rows = new IntArrayList(); + if( headers.length == 0 ) { + for( int i = 0; i < id.headers.length; i++ ) { + rows.add( i ); + } + } else { + for( String header : headers ) { + int index = ArrayUtils.indexOf( id.headers, header ); + + Preconditions.checkArgument( index >= 0, "header " + header + " not found" ); + + rows.add( index ); + } + } + ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream( outputs.getOrDefault( id, new ByteArrayOutputStream() ).toByteArray() ); RowBinaryInputStream rowBinaryInputStream = new RowBinaryInputStream( byteArrayInputStream, id.headers, id.types ); List objects; while( ( objects = rowBinaryInputStream.readRow() ) != null ) { ArrayList filtered = new ArrayList<>(); - for( int i = 0; i < id.headers.length; i++ ) { - if( headers.length == 0 || ArrayUtils.contains( headers, id.headers[i] ) ) { - filtered.add( objects.get( i ) ); - } + for( int i : rows ) { + filtered.add( objects.get( i ) ); } - ret.add( filtered ); } } diff --git a/pom.xml b/pom.xml index 8a804ac5b..380b7af61 100644 --- a/pom.xml +++ b/pom.xml @@ -57,7 +57,7 @@ - 25.4.7 + 25.4.8 25.0.1 25.0.0