Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Objects;

public class CompactionTsFileWriter extends TsFileIOWriter {
CompactionType type;
Expand Down Expand Up @@ -181,15 +182,21 @@ public boolean isEmptyTargetFile() {
}

private void removeUnusedTableSchema() {
Map<String, TableSchema> tableSchemaMap = getSchema().getTableSchemaMap();
Iterator<Map.Entry<String, TableSchema>> iterator = tableSchemaMap.entrySet().iterator();
final Map<String, TableSchema> tableSchemaMap = getSchema().getTableSchemaMap();
final Iterator<Map.Entry<String, TableSchema>> iterator = tableSchemaMap.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<String, TableSchema> entry = iterator.next();
List<ColumnCategory> columnTypes = entry.getValue().getColumnTypes();
if (columnTypes.contains(ColumnCategory.FIELD)) {
final Map.Entry<String, TableSchema> entry = iterator.next();
final List<ColumnCategory> columnTypes = entry.getValue().getColumnTypes();
if (hasFieldOrTimeColumn(columnTypes)) {
continue;
}
iterator.remove();
}
}

private boolean hasFieldOrTimeColumn(final List<ColumnCategory> columnTypes) {
return Objects.nonNull(columnTypes)
&& (columnTypes.contains(ColumnCategory.FIELD)
|| columnTypes.contains(ColumnCategory.TIME));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@

package org.apache.iotdb.db.storageengine.dataregion.compaction.tablemodel;

import org.apache.iotdb.commons.utils.TestOnly;
import org.apache.iotdb.db.storageengine.dataregion.compaction.execute.utils.CompactionTableSchema;
import org.apache.iotdb.db.storageengine.dataregion.compaction.utils.CompactionTestFileWriter;
import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResource;
Expand All @@ -30,12 +31,15 @@
import org.apache.tsfile.file.metadata.TableSchema;
import org.apache.tsfile.file.metadata.enums.CompressionType;
import org.apache.tsfile.file.metadata.enums.TSEncoding;
import org.apache.tsfile.read.common.TimeRange;
import org.apache.tsfile.write.chunk.AlignedChunkWriterImpl;
import org.apache.tsfile.write.schema.IMeasurementSchema;
import org.apache.tsfile.write.schema.MeasurementSchema;
import org.apache.tsfile.write.schema.Schema;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class CompactionTableModelTestFileWriter extends CompactionTestFileWriter {
Expand All @@ -61,6 +65,22 @@ public void registerTableSchema(String tableName, List<String> idColumnNames) {
schema.registerTableSchema(tableSchema);
}

public void registerTableSchemaWithTagAndTime(String tableName, List<String> idColumnNames) {
List<IMeasurementSchema> measurementSchemas = new ArrayList<>();
List<ColumnCategory> columnTypes = new ArrayList<>();
for (String idColumnName : idColumnNames) {
measurementSchemas.add(
new MeasurementSchema(
idColumnName, TSDataType.STRING, TSEncoding.PLAIN, CompressionType.UNCOMPRESSED));
columnTypes.add(ColumnCategory.TAG);
}
measurementSchemas.add(
new MeasurementSchema(
"time", TSDataType.INT64, TSEncoding.PLAIN, CompressionType.UNCOMPRESSED));
columnTypes.add(ColumnCategory.TIME);
schema.registerTableSchema(new TableSchema(tableName, measurementSchemas, columnTypes));
}

public void registerTableSchemaWithTagField(String tableName, List<String> columnNames) {
List<IMeasurementSchema> measurementSchemas = new ArrayList<>();
List<ColumnCategory> columnTypes = new ArrayList<>();
Expand All @@ -75,6 +95,19 @@ public void registerTableSchemaWithTagField(String tableName, List<String> colum
schema.registerTableSchema(new TableSchema(tableName, measurementSchemas, columnTypes));
}

@TestOnly
public void generateTimeOnlyDataToCurrentDevice(TimeRange[] timeRanges) throws IOException {
for (TimeRange timeRange : timeRanges) {
AlignedChunkWriterImpl chunkWriter = new AlignedChunkWriterImpl(Collections.emptyList());
currentDeviceStartTime = Math.min(timeRange.getMin(), currentDeviceStartTime);
currentDeviceEndTime = Math.max(timeRange.getMax(), currentDeviceEndTime);
for (long time = timeRange.getMin(); time <= timeRange.getMax(); time++) {
chunkWriter.getTimeChunkWriter().write(time);
}
chunkWriter.writeToFileWriter(fileWriter);
}
}

public IDeviceID startChunkGroup(String tableName, List<String> idColumnFields)
throws IOException {
int idx = 0;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,14 @@
import org.apache.iotdb.commons.exception.MetadataException;
import org.apache.iotdb.db.exception.StorageEngineException;
import org.apache.iotdb.db.storageengine.dataregion.compaction.AbstractCompactionTest;
import org.apache.iotdb.db.storageengine.dataregion.compaction.tablemodel.CompactionTableModelTestFileWriter;
import org.apache.iotdb.db.storageengine.dataregion.tsfile.TsFileResource;

import org.apache.tsfile.enums.ColumnCategory;
import org.apache.tsfile.exception.write.WriteProcessException;
import org.apache.tsfile.file.metadata.enums.CompressionType;
import org.apache.tsfile.file.metadata.enums.TSEncoding;
import org.apache.tsfile.read.TsFileSequenceReader;
import org.apache.tsfile.read.common.TimeRange;
import org.junit.After;
import org.junit.Assert;
Expand All @@ -35,6 +38,7 @@

import java.io.IOException;
import java.util.Arrays;
import java.util.Collections;

public class CompactionTestFileWriterTest extends AbstractCompactionTest {
@Before
Expand Down Expand Up @@ -196,4 +200,23 @@ public void testGenerateAlignedSeriesWithPoints() throws IOException {
Assert.fail();
}
}

@Test
public void testFieldlessTableSchemaWithTimeDataIsRetained() throws IOException {
final TsFileResource resource = createEmptyFileAndResource(true);
try (final CompactionTableModelTestFileWriter writer =
new CompactionTableModelTestFileWriter(resource)) {
writer.registerTableSchemaWithTagAndTime("table1", Collections.singletonList("tag1"));
writer.startChunkGroup("table1", Collections.singletonList("tag1_value"));
writer.generateTimeOnlyDataToCurrentDevice(new TimeRange[] {new TimeRange(1, 3)});
writer.endChunkGroup();
writer.endFile();
}
try (final TsFileSequenceReader reader =
new TsFileSequenceReader(resource.getTsFile().getAbsolutePath())) {
Assert.assertTrue(reader.getTableSchemaMap().containsKey("table1"));
Assert.assertFalse(
reader.getTableSchemaMap().get("table1").getColumnTypes().contains(ColumnCategory.FIELD));
}
}
}
Loading