jon-wei closed pull request #6460: Add check for nullable numRows
URL: https://github.com/apache/incubator-druid/pull/6460
This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:
As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):
diff --git
a/sql/src/main/java/org/apache/druid/sql/calcite/schema/SegmentMetadataHolder.java
b/sql/src/main/java/org/apache/druid/sql/calcite/schema/SegmentMetadataHolder.java
index 377f5020cdc..cb446e91109 100644
---
a/sql/src/main/java/org/apache/druid/sql/calcite/schema/SegmentMetadataHolder.java
+++
b/sql/src/main/java/org/apache/druid/sql/calcite/schema/SegmentMetadataHolder.java
@@ -36,10 +36,9 @@
private final long isRealtime;
private final String segmentId;
private final long numReplicas;
+ private final long numRows;
@Nullable
private final RowSignature rowSignature;
- @Nullable
- private final Long numRows;
private SegmentMetadataHolder(Builder builder)
{
@@ -77,8 +76,7 @@ public long getNumReplicas()
return numReplicas;
}
- @Nullable
- public Long getNumRows()
+ public long getNumRows()
{
return numRows;
}
@@ -99,8 +97,7 @@ public RowSignature getRowSignature()
private long numReplicas;
@Nullable
private RowSignature rowSignature;
- @Nullable
- private Long numRows;
+ private long numRows;
public Builder(
String segmentId,
@@ -123,7 +120,7 @@ public Builder withRowSignature(RowSignature rowSignature)
return this;
}
- public Builder withNumRows(Long numRows)
+ public Builder withNumRows(long numRows)
{
this.numRows = numRows;
return this;
diff --git
a/sql/src/main/java/org/apache/druid/sql/calcite/schema/SystemSchema.java
b/sql/src/main/java/org/apache/druid/sql/calcite/schema/SystemSchema.java
index e24699d61a2..8e219a64625 100644
--- a/sql/src/main/java/org/apache/druid/sql/calcite/schema/SystemSchema.java
+++ b/sql/src/main/java/org/apache/druid/sql/calcite/schema/SystemSchema.java
@@ -235,6 +235,13 @@ public TableType getJdbcTableType()
try {
segmentsAlreadySeen.add(val.getIdentifier());
final PartialSegmentData partialSegmentData =
partialSegmentDataMap.get(val.getIdentifier());
+ long numReplicas = 0L, numRows = 0L, isRealtime = 0L,
isAvailable = 1L;
+ if (partialSegmentData != null) {
+ numReplicas = partialSegmentData.getNumReplicas();
+ numRows = partialSegmentData.getNumRows();
+ isAvailable = partialSegmentData.isAvailable();
+ isRealtime = partialSegmentData.isRealtime();
+ }
return new Object[]{
val.getIdentifier(),
val.getDataSource(),
@@ -243,11 +250,11 @@ public TableType getJdbcTableType()
val.getSize(),
val.getVersion(),
val.getShardSpec().getPartitionNum(),
- partialSegmentData == null ? 0L :
partialSegmentData.getNumReplicas(),
- partialSegmentData == null ? 0L :
partialSegmentData.getNumRows(),
+ numReplicas,
+ numRows,
1L, //is_published is true for published segments
- partialSegmentData == null ? 1L :
partialSegmentData.isAvailable(),
- partialSegmentData == null ? 0L :
partialSegmentData.isRealtime(),
+ isAvailable,
+ isRealtime,
jsonMapper.writeValueAsString(val)
};
}
@@ -340,13 +347,13 @@ public TableType getJdbcTableType()
private final long isAvailable;
private final long isRealtime;
private final long numReplicas;
- private final Long numRows;
+ private final long numRows;
public PartialSegmentData(
final long isAvailable,
final long isRealtime,
final long numReplicas,
- final Long numRows
+ final long numRows
)
{
@@ -371,7 +378,7 @@ public long getNumReplicas()
return numReplicas;
}
- public Long getNumRows()
+ public long getNumRows()
{
return numRows;
}
@@ -466,7 +473,7 @@ public TableType getJdbcTableType()
}
}
- private static class ServerSegmentsTable extends AbstractTable implements
ScannableTable
+ static class ServerSegmentsTable extends AbstractTable implements
ScannableTable
{
private final TimelineServerView serverView;
final AuthorizerMapper authorizerMapper;
diff --git
a/sql/src/test/java/org/apache/druid/sql/calcite/schema/SystemSchemaTest.java
b/sql/src/test/java/org/apache/druid/sql/calcite/schema/SystemSchemaTest.java
index 8e87ac0ba27..528d9725217 100644
---
a/sql/src/test/java/org/apache/druid/sql/calcite/schema/SystemSchemaTest.java
+++
b/sql/src/test/java/org/apache/druid/sql/calcite/schema/SystemSchemaTest.java
@@ -34,24 +34,19 @@
import org.apache.calcite.schema.SchemaPlus;
import org.apache.calcite.schema.Table;
import org.apache.calcite.sql.type.SqlTypeName;
-import org.apache.druid.client.DirectDruidClient;
import org.apache.druid.client.DruidServer;
import org.apache.druid.client.ImmutableDruidServer;
import org.apache.druid.client.TimelineServerView;
import org.apache.druid.data.input.InputRow;
import org.apache.druid.discovery.DruidLeaderClient;
-import org.apache.druid.jackson.DefaultObjectMapper;
import org.apache.druid.java.util.common.Intervals;
import org.apache.druid.java.util.common.Pair;
import org.apache.druid.java.util.common.io.Closer;
-import org.apache.druid.java.util.http.client.HttpClient;
import org.apache.druid.java.util.http.client.Request;
import
org.apache.druid.java.util.http.client.io.AppendableByteArrayInputStream;
import org.apache.druid.java.util.http.client.response.FullResponseHolder;
import org.apache.druid.java.util.http.client.response.HttpResponseHandler;
import org.apache.druid.query.QueryRunnerFactoryConglomerate;
-import org.apache.druid.query.QueryRunnerTestHelper;
-import org.apache.druid.query.ReflectionQueryToolChestWarehouse;
import org.apache.druid.query.aggregation.CountAggregatorFactory;
import org.apache.druid.query.aggregation.DoubleSumAggregatorFactory;
import org.apache.druid.query.aggregation.LongSumAggregatorFactory;
@@ -64,7 +59,6 @@
import org.apache.druid.server.coordination.DruidServerMetadata;
import org.apache.druid.server.coordination.ServerType;
import org.apache.druid.server.coordinator.BytesAccumulatingResponseHandler;
-import org.apache.druid.server.metrics.NoopServiceEmitter;
import org.apache.druid.server.security.Access;
import org.apache.druid.server.security.Authorizer;
import org.apache.druid.server.security.AuthorizerMapper;
@@ -284,25 +278,6 @@ public Authorizer getAuthorizer(String name)
DataSegment.PruneLoadSpecHolder.DEFAULT
);
- private final HttpClient httpClient = EasyMock.createMock(HttpClient.class);
- private final DirectDruidClient client1 = new DirectDruidClient(
- new ReflectionQueryToolChestWarehouse(),
- QueryRunnerTestHelper.NOOP_QUERYWATCHER,
- new DefaultObjectMapper(),
- httpClient,
- "http",
- "foo",
- new NoopServiceEmitter()
- );
- private final DirectDruidClient client2 = new DirectDruidClient(
- new ReflectionQueryToolChestWarehouse(),
- QueryRunnerTestHelper.NOOP_QUERYWATCHER,
- new DefaultObjectMapper(),
- httpClient,
- "http",
- "foo2",
- new NoopServiceEmitter()
- );
private final ImmutableDruidServer druidServer1 = new ImmutableDruidServer(
new DruidServerMetadata("server1", "localhost:0000", null, 5L,
ServerType.REALTIME, DruidServer.DEFAULT_TIER, 0),
1L,
@@ -314,7 +289,7 @@ public Authorizer getAuthorizer(String name)
new DruidServerMetadata("server2", "server2:1234", null, 5L,
ServerType.HISTORICAL, DruidServer.DEFAULT_TIER, 0),
1L,
null,
- ImmutableMap.of("segment2", segment2, "segment4", segment4, "segment5",
segment5)
+ ImmutableMap.of("segment3", segment3, "segment4", segment4, "segment5",
segment5)
);
private final List<ImmutableDruidServer> immutableDruidServers =
ImmutableList.of(druidServer1, druidServer2);
@@ -466,6 +441,7 @@ public Object get(String name)
//segment 6 is published and unavailable, num_replicas is 0
Assert.assertEquals(1L, row1[9]);
Assert.assertEquals(0L, row1[7]);
+ Assert.assertEquals(0L, row1[8]); //numRows = 0
Assert.assertEquals(true, enumerator.moveNext());
Assert.assertEquals(true, enumerator.moveNext());
@@ -476,6 +452,7 @@ public Object get(String name)
//segment 2 is published and has 2 replicas
Assert.assertEquals(1L, row5[9]);
Assert.assertEquals(2L, row5[7]);
+ Assert.assertEquals(3L, row5[8]); //numRows = 3
Assert.assertEquals(true, enumerator.moveNext());
Assert.assertEquals(false, enumerator.moveNext());
@@ -528,6 +505,84 @@ public Object get(String name)
Assert.assertEquals("historical", row2[4].toString());
}
+ @Test
+ public void testServerSegmentsTable()
+ {
+ SystemSchema.ServerSegmentsTable serverSegmentsTable =
EasyMock.createMockBuilder(SystemSchema.ServerSegmentsTable.class)
+
.withConstructor(serverView, authMapper)
+
.createMock();
+ EasyMock.replay(serverSegmentsTable);
+ EasyMock.expect(serverView.getDruidServers())
+ .andReturn(immutableDruidServers)
+ .once();
+ EasyMock.replay(serverView);
+ DataContext dataContext = new DataContext()
+ {
+ @Override
+ public SchemaPlus getRootSchema()
+ {
+ return null;
+ }
+
+ @Override
+ public JavaTypeFactory getTypeFactory()
+ {
+ return null;
+ }
+
+ @Override
+ public QueryProvider getQueryProvider()
+ {
+ return null;
+ }
+
+ @Override
+ public Object get(String name)
+ {
+ return CalciteTests.SUPER_USER_AUTH_RESULT;
+ }
+ };
+ Enumerable<Object[]> rows = serverSegmentsTable.scan(dataContext);
+ Assert.assertEquals(5, rows.count());
+
+ //server_segments table is the join of servers and segments table
+ // it will have 5 rows as follows
+ // localhost:0000 |
test1_2010-01-01T00:00:00.000Z_2011-01-01T00:00:00.000Z_version1(segment1)
+ // localhost:0000 |
test2_2011-01-01T00:00:00.000Z_2012-01-01T00:00:00.000Z_version2(segment2)
+ // server2:1234 |
test3_2012-01-01T00:00:00.000Z_2013-01-01T00:00:00.000Z_version3(segment3)
+ // server2:1234 |
test4_2017-01-01T00:00:00.000Z_2018-01-01T00:00:00.000Z_version4(segment4)
+ // server2:1234 |
test5_2017-01-01T00:00:00.000Z_2018-01-01T00:00:00.000Z_version5(segment5)
+
+ Enumerator<Object[]> enumerator = rows.enumerator();
+ Assert.assertEquals(true, enumerator.moveNext());
+
+ Object[] row1 = rows.first();
+ Assert.assertEquals("localhost:0000", row1[0]);
+
Assert.assertEquals("test1_2010-01-01T00:00:00.000Z_2011-01-01T00:00:00.000Z_version1",
row1[1]);
+
+ Assert.assertEquals(true, enumerator.moveNext());
+ Object[] row2 = enumerator.current();
+ Assert.assertEquals("localhost:0000", row2[0]);
+
Assert.assertEquals("test2_2011-01-01T00:00:00.000Z_2012-01-01T00:00:00.000Z_version2",
row2[1]);
+
+ Assert.assertEquals(true, enumerator.moveNext());
+ Object[] row3 = enumerator.current();
+ Assert.assertEquals("server2:1234", row3[0]);
+
Assert.assertEquals("test3_2012-01-01T00:00:00.000Z_2013-01-01T00:00:00.000Z_version3",
row3[1]);
+
+ Assert.assertEquals(true, enumerator.moveNext());
+ Object[] row4 = enumerator.current();
+ Assert.assertEquals("server2:1234", row4[0]);
+
Assert.assertEquals("test4_2017-01-01T00:00:00.000Z_2018-01-01T00:00:00.000Z_version4",
row4[1]);
+
+ Assert.assertEquals(true, enumerator.moveNext());
+ Object[] row5 = rows.last();
+ Assert.assertEquals("server2:1234", row5[0]);
+
Assert.assertEquals("test5_2017-01-01T00:00:00.000Z_2018-01-01T00:00:00.000Z_version5",
row5[1]);
+
+ Assert.assertEquals(false, enumerator.moveNext());
+ }
+
@Test
public void testTasksTable() throws Exception
{
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
[email protected]
With regards,
Apache Git Services
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]