decoratePostAggregators(
diff --git a/processing/src/main/java/io/druid/query/Query.java b/processing/src/main/java/io/druid/query/Query.java
index e8c62962f539..9e0d8a0f658d 100644
--- a/processing/src/main/java/io/druid/query/Query.java
+++ b/processing/src/main/java/io/druid/query/Query.java
@@ -22,6 +22,7 @@
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.google.common.collect.Ordering;
+import io.druid.guice.annotations.ExtensionPoint;
import io.druid.query.datasourcemetadata.DataSourceMetadataQuery;
import io.druid.query.filter.DimFilter;
import io.druid.query.groupby.GroupByQuery;
@@ -38,6 +39,7 @@
import java.util.List;
import java.util.Map;
+@ExtensionPoint
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "queryType")
@JsonSubTypes(value = {
@JsonSubTypes.Type(name = Query.TIMESERIES, value = TimeseriesQuery.class),
diff --git a/processing/src/main/java/io/druid/query/QueryContexts.java b/processing/src/main/java/io/druid/query/QueryContexts.java
index 2e9dfdd9b684..b56812d8b0e5 100644
--- a/processing/src/main/java/io/druid/query/QueryContexts.java
+++ b/processing/src/main/java/io/druid/query/QueryContexts.java
@@ -21,9 +21,11 @@
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableMap;
+import io.druid.guice.annotations.PublicApi;
import io.druid.java.util.common.IAE;
import io.druid.java.util.common.ISE;
+@PublicApi
public class QueryContexts
{
public static final String PRIORITY_KEY = "priority";
diff --git a/processing/src/main/java/io/druid/query/QueryMetrics.java b/processing/src/main/java/io/druid/query/QueryMetrics.java
index 86c29fe8b726..7eab88c5af1a 100644
--- a/processing/src/main/java/io/druid/query/QueryMetrics.java
+++ b/processing/src/main/java/io/druid/query/QueryMetrics.java
@@ -78,6 +78,9 @@
* dimension or metric is useful and not very expensive to process and store then emit, skip (see above Goals, 1.)
* otherwise.
*
+ * This interface can be extended, but is not marked as an {@code ExtensionPoint}, because it may change in breaking
+ * ways even in minor releases.
+ *
*
If implementors of custom QueryMetrics don't want to fix builds on every Druid release (e. g. if they want to add
* a single dimension to emitted events and don't want to alter other dimensions and emitted metrics), they could
* inherit their custom QueryMetrics from {@link DefaultQueryMetrics} or query-specific default implementation class,
diff --git a/processing/src/main/java/io/druid/query/QueryPlus.java b/processing/src/main/java/io/druid/query/QueryPlus.java
index c6cfe6f89f88..63d2e8abe877 100644
--- a/processing/src/main/java/io/druid/query/QueryPlus.java
+++ b/processing/src/main/java/io/druid/query/QueryPlus.java
@@ -20,6 +20,7 @@
package io.druid.query;
import com.google.common.base.Preconditions;
+import io.druid.guice.annotations.PublicApi;
import io.druid.java.util.common.guava.Sequence;
import io.druid.query.spec.QuerySegmentSpec;
@@ -30,6 +31,7 @@
* An immutable composite object of {@link Query} + extra stuff needed in {@link QueryRunner}s. This "extra stuff"
* is only {@link QueryMetrics} yet.
*/
+@PublicApi
public final class QueryPlus
{
/**
diff --git a/processing/src/main/java/io/druid/query/QueryRunner.java b/processing/src/main/java/io/druid/query/QueryRunner.java
index cf9366451e07..b9cbf5244f66 100644
--- a/processing/src/main/java/io/druid/query/QueryRunner.java
+++ b/processing/src/main/java/io/druid/query/QueryRunner.java
@@ -19,10 +19,12 @@
package io.druid.query;
+import io.druid.guice.annotations.ExtensionPoint;
import io.druid.java.util.common.guava.Sequence;
import java.util.Map;
+@ExtensionPoint
public interface QueryRunner
{
/**
diff --git a/processing/src/main/java/io/druid/query/QueryRunnerFactory.java b/processing/src/main/java/io/druid/query/QueryRunnerFactory.java
index 3eb2eae4e0a3..cc1419be978c 100644
--- a/processing/src/main/java/io/druid/query/QueryRunnerFactory.java
+++ b/processing/src/main/java/io/druid/query/QueryRunnerFactory.java
@@ -19,6 +19,7 @@
package io.druid.query;
+import io.druid.guice.annotations.ExtensionPoint;
import io.druid.segment.Segment;
import java.util.concurrent.ExecutorService;
@@ -26,6 +27,7 @@
/**
* An interface that defines the nitty gritty implementation detauls of a Query on a Segment
*/
+@ExtensionPoint
public interface QueryRunnerFactory>
{
/**
diff --git a/processing/src/main/java/io/druid/query/QueryToolChest.java b/processing/src/main/java/io/druid/query/QueryToolChest.java
index c41bb86c4388..9cb78c5d98c0 100644
--- a/processing/src/main/java/io/druid/query/QueryToolChest.java
+++ b/processing/src/main/java/io/druid/query/QueryToolChest.java
@@ -21,6 +21,7 @@
import com.fasterxml.jackson.core.type.TypeReference;
import com.google.common.base.Function;
+import io.druid.guice.annotations.ExtensionPoint;
import io.druid.query.aggregation.MetricManipulationFn;
import io.druid.timeline.LogicalSegment;
@@ -28,10 +29,9 @@
import java.util.List;
/**
- * The broker-side (also used by server in some cases) API for a specific Query type. This API is still undergoing
- * evolution and is only semi-stable, so proprietary Query implementations should be ready for the potential
- * maintenance burden when upgrading versions.
+ * The broker-side (also used by server in some cases) API for a specific Query type.
*/
+@ExtensionPoint
public abstract class QueryToolChest>
{
/**
diff --git a/processing/src/main/java/io/druid/query/Result.java b/processing/src/main/java/io/druid/query/Result.java
index 0a23ad625f4c..10afea9c23b7 100644
--- a/processing/src/main/java/io/druid/query/Result.java
+++ b/processing/src/main/java/io/druid/query/Result.java
@@ -21,12 +21,14 @@
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
+import io.druid.guice.annotations.PublicApi;
import org.joda.time.DateTime;
import java.util.function.Function;
/**
*/
+@PublicApi
public class Result implements Comparable>
{
public static String MISSING_SEGMENTS_KEY = "missingSegments";
diff --git a/processing/src/main/java/io/druid/query/ResultGranularTimestampComparator.java b/processing/src/main/java/io/druid/query/ResultGranularTimestampComparator.java
index 98953a5687ce..8bf6c9e8fede 100644
--- a/processing/src/main/java/io/druid/query/ResultGranularTimestampComparator.java
+++ b/processing/src/main/java/io/druid/query/ResultGranularTimestampComparator.java
@@ -21,12 +21,14 @@
import com.google.common.collect.Ordering;
import com.google.common.primitives.Longs;
+import io.druid.guice.annotations.PublicApi;
import io.druid.java.util.common.granularity.Granularity;
import java.util.Comparator;
/**
*/
+@PublicApi
public class ResultGranularTimestampComparator implements Comparator>
{
private final Granularity gran;
diff --git a/processing/src/main/java/io/druid/query/ResultMergeQueryRunner.java b/processing/src/main/java/io/druid/query/ResultMergeQueryRunner.java
index 04c6e550dd74..7840a7de5d5a 100644
--- a/processing/src/main/java/io/druid/query/ResultMergeQueryRunner.java
+++ b/processing/src/main/java/io/druid/query/ResultMergeQueryRunner.java
@@ -21,6 +21,7 @@
import com.google.common.collect.Ordering;
import io.druid.common.guava.CombiningSequence;
+import io.druid.guice.annotations.PublicApi;
import io.druid.java.util.common.guava.Sequence;
import io.druid.java.util.common.guava.nary.BinaryFn;
@@ -28,6 +29,7 @@
/**
*/
+@PublicApi
public abstract class ResultMergeQueryRunner extends BySegmentSkippingQueryRunner
{
public ResultMergeQueryRunner(
diff --git a/processing/src/main/java/io/druid/query/aggregation/Aggregator.java b/processing/src/main/java/io/druid/query/aggregation/Aggregator.java
index 847fdcb67838..d7fba1e3c5cd 100644
--- a/processing/src/main/java/io/druid/query/aggregation/Aggregator.java
+++ b/processing/src/main/java/io/druid/query/aggregation/Aggregator.java
@@ -19,6 +19,8 @@
package io.druid.query.aggregation;
+import io.druid.guice.annotations.ExtensionPoint;
+
import java.io.Closeable;
/**
@@ -30,6 +32,7 @@
* to aggregate(). This is currently (as of this documentation) implemented through the use of {@link
* io.druid.segment.ColumnValueSelector} objects.
*/
+@ExtensionPoint
public interface Aggregator extends Closeable
{
void aggregate();
diff --git a/processing/src/main/java/io/druid/query/aggregation/AggregatorFactory.java b/processing/src/main/java/io/druid/query/aggregation/AggregatorFactory.java
index 9a37e1629556..f4e67c34e26b 100644
--- a/processing/src/main/java/io/druid/query/aggregation/AggregatorFactory.java
+++ b/processing/src/main/java/io/druid/query/aggregation/AggregatorFactory.java
@@ -19,6 +19,7 @@
package io.druid.query.aggregation;
+import io.druid.guice.annotations.ExtensionPoint;
import io.druid.java.util.common.Cacheable;
import io.druid.java.util.common.UOE;
import io.druid.java.util.common.logger.Logger;
@@ -35,6 +36,7 @@
* max, sum of metric columns, or cardinality of dimension columns (see {@link
* io.druid.query.aggregation.cardinality.CardinalityAggregatorFactory}).
*/
+@ExtensionPoint
public abstract class AggregatorFactory implements Cacheable
{
private static final Logger log = new Logger(AggregatorFactory.class);
diff --git a/processing/src/main/java/io/druid/query/aggregation/AggregatorUtil.java b/processing/src/main/java/io/druid/query/aggregation/AggregatorUtil.java
index 399880188ee3..d8adbe3182a5 100644
--- a/processing/src/main/java/io/druid/query/aggregation/AggregatorUtil.java
+++ b/processing/src/main/java/io/druid/query/aggregation/AggregatorUtil.java
@@ -20,6 +20,7 @@
package io.druid.query.aggregation;
import com.google.common.collect.Lists;
+import io.druid.guice.annotations.PublicApi;
import io.druid.java.util.common.Pair;
import io.druid.math.expr.ExprMacroTable;
import io.druid.math.expr.Parser;
@@ -34,6 +35,7 @@
import java.util.List;
import java.util.Set;
+@PublicApi
public class AggregatorUtil
{
public static final byte STRING_SEPARATOR = (byte) 0xFF;
diff --git a/processing/src/main/java/io/druid/query/aggregation/BufferAggregator.java b/processing/src/main/java/io/druid/query/aggregation/BufferAggregator.java
index 9dc9acb32675..cdddd7629f2d 100644
--- a/processing/src/main/java/io/druid/query/aggregation/BufferAggregator.java
+++ b/processing/src/main/java/io/druid/query/aggregation/BufferAggregator.java
@@ -19,6 +19,7 @@
package io.druid.query.aggregation;
+import io.druid.guice.annotations.ExtensionPoint;
import io.druid.query.monomorphicprocessing.CalledFromHotLoop;
import io.druid.query.monomorphicprocessing.HotLoopCallee;
import io.druid.query.monomorphicprocessing.RuntimeShapeInspector;
@@ -33,6 +34,7 @@
* Thus, an Aggregator can be thought of as a closure over some other thing that is stateful and changes between calls
* to aggregate(...).
*/
+@ExtensionPoint
public interface BufferAggregator extends HotLoopCallee
{
/**
diff --git a/processing/src/main/java/io/druid/query/aggregation/MetricManipulationFn.java b/processing/src/main/java/io/druid/query/aggregation/MetricManipulationFn.java
index 15f391a43dbe..19812e3f8a97 100644
--- a/processing/src/main/java/io/druid/query/aggregation/MetricManipulationFn.java
+++ b/processing/src/main/java/io/druid/query/aggregation/MetricManipulationFn.java
@@ -19,8 +19,11 @@
package io.druid.query.aggregation;
+import io.druid.guice.annotations.PublicApi;
+
/**
*/
+@PublicApi
public interface MetricManipulationFn
{
public Object manipulate(AggregatorFactory factory, Object object);
diff --git a/processing/src/main/java/io/druid/query/aggregation/PostAggregator.java b/processing/src/main/java/io/druid/query/aggregation/PostAggregator.java
index 5366d5e546a0..171d4f39ef18 100644
--- a/processing/src/main/java/io/druid/query/aggregation/PostAggregator.java
+++ b/processing/src/main/java/io/druid/query/aggregation/PostAggregator.java
@@ -19,6 +19,7 @@
package io.druid.query.aggregation;
+import io.druid.guice.annotations.ExtensionPoint;
import io.druid.java.util.common.Cacheable;
import java.util.Comparator;
@@ -28,6 +29,7 @@
/**
* Functionally similar to an Aggregator. See the Aggregator interface for more comments.
*/
+@ExtensionPoint
public interface PostAggregator extends Cacheable
{
Set getDependentFields();
diff --git a/processing/src/main/java/io/druid/query/cache/CacheKeyBuilder.java b/processing/src/main/java/io/druid/query/cache/CacheKeyBuilder.java
index 81a89e4e936b..530f2725bc14 100644
--- a/processing/src/main/java/io/druid/query/cache/CacheKeyBuilder.java
+++ b/processing/src/main/java/io/druid/query/cache/CacheKeyBuilder.java
@@ -26,6 +26,7 @@
import com.google.common.primitives.Floats;
import com.google.common.primitives.Ints;
import com.google.common.primitives.UnsignedBytes;
+import io.druid.guice.annotations.PublicApi;
import io.druid.java.util.common.StringUtils;
import io.druid.java.util.common.Cacheable;
@@ -50,6 +51,7 @@
* +--------------------------------------------------------+
*
*/
+@PublicApi
public class CacheKeyBuilder
{
static final byte BYTE_KEY = 0;
diff --git a/processing/src/main/java/io/druid/query/dimension/DimensionSpec.java b/processing/src/main/java/io/druid/query/dimension/DimensionSpec.java
index 7749be3120ef..7a98ffd5edb8 100644
--- a/processing/src/main/java/io/druid/query/dimension/DimensionSpec.java
+++ b/processing/src/main/java/io/druid/query/dimension/DimensionSpec.java
@@ -27,6 +27,8 @@
import io.druid.segment.column.ValueType;
/**
+ * Provides information about a dimension for a grouping query, like topN or groupBy. Note that this is not annotated
+ * with {@code PublicApi}, since it is not meant to be stable for usage by non-built-in queries.
*/
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type", defaultImpl = LegacyDimensionSpec.class)
@JsonSubTypes(value = {
diff --git a/processing/src/main/java/io/druid/query/extraction/ExtractionFn.java b/processing/src/main/java/io/druid/query/extraction/ExtractionFn.java
index 0bfe2033fc71..b3e7cb39098f 100644
--- a/processing/src/main/java/io/druid/query/extraction/ExtractionFn.java
+++ b/processing/src/main/java/io/druid/query/extraction/ExtractionFn.java
@@ -21,6 +21,7 @@
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
+import io.druid.guice.annotations.ExtensionPoint;
import io.druid.query.lookup.LookupExtractionFn;
import io.druid.query.lookup.RegisteredLookupExtractionFn;
@@ -28,6 +29,7 @@
/**
*/
+@ExtensionPoint
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type")
@JsonSubTypes(value = {
@JsonSubTypes.Type(name = "time", value = TimeDimExtractionFn.class),
diff --git a/processing/src/main/java/io/druid/segment/GenericColumnSerializer.java b/processing/src/main/java/io/druid/segment/GenericColumnSerializer.java
index 19f8b451b02d..474d7dafe524 100644
--- a/processing/src/main/java/io/druid/segment/GenericColumnSerializer.java
+++ b/processing/src/main/java/io/druid/segment/GenericColumnSerializer.java
@@ -19,12 +19,14 @@
package io.druid.segment;
+import io.druid.guice.annotations.ExtensionPoint;
import io.druid.java.util.common.io.smoosh.FileSmoosher;
import java.io.Closeable;
import java.io.IOException;
import java.nio.channels.WritableByteChannel;
+@ExtensionPoint
public interface GenericColumnSerializer extends Closeable
{
public void open() throws IOException;
diff --git a/processing/src/main/java/io/druid/segment/Metadata.java b/processing/src/main/java/io/druid/segment/Metadata.java
index 3ac724e8f0c5..e7cf31354f2f 100644
--- a/processing/src/main/java/io/druid/segment/Metadata.java
+++ b/processing/src/main/java/io/druid/segment/Metadata.java
@@ -21,6 +21,7 @@
import com.fasterxml.jackson.annotation.JsonProperty;
import io.druid.data.input.impl.TimestampSpec;
+import io.druid.guice.annotations.PublicApi;
import io.druid.java.util.common.granularity.Granularity;
import io.druid.query.aggregation.AggregatorFactory;
@@ -33,6 +34,7 @@
/**
*/
+@PublicApi
public class Metadata
{
// container is used for arbitrary key-value pairs in segment metadata e.g.
diff --git a/processing/src/main/java/io/druid/segment/QueryableIndex.java b/processing/src/main/java/io/druid/segment/QueryableIndex.java
index ee50675f4b86..fcfd6b2395a1 100644
--- a/processing/src/main/java/io/druid/segment/QueryableIndex.java
+++ b/processing/src/main/java/io/druid/segment/QueryableIndex.java
@@ -28,6 +28,11 @@
import java.util.Map;
/**
+ * Direct interface to memory mapped segments. Not a public API for extensions; site specific queries should be
+ * using {@link StorageAdapter}.
+ *
+ * @see QueryableIndexStorageAdapter for query path adapter
+ * @see QueryableIndexIndexableAdapter for indexing path adapter
*/
public interface QueryableIndex extends ColumnSelector, Closeable
{
diff --git a/processing/src/main/java/io/druid/segment/QueryableIndexStorageAdapter.java b/processing/src/main/java/io/druid/segment/QueryableIndexStorageAdapter.java
index fb0f7eb6fe55..550a009bedea 100644
--- a/processing/src/main/java/io/druid/segment/QueryableIndexStorageAdapter.java
+++ b/processing/src/main/java/io/druid/segment/QueryableIndexStorageAdapter.java
@@ -173,12 +173,6 @@ public ColumnCapabilities getColumnCapabilities(String column)
return getColumnCapabilites(index, column);
}
- @Override
- public Map getDimensionHandlers()
- {
- return index.getDimensionHandlers();
- }
-
@Override
public String getColumnTypeName(String columnName)
{
diff --git a/processing/src/main/java/io/druid/segment/Segment.java b/processing/src/main/java/io/druid/segment/Segment.java
index aef3dc865132..4c38a7f36b49 100644
--- a/processing/src/main/java/io/druid/segment/Segment.java
+++ b/processing/src/main/java/io/druid/segment/Segment.java
@@ -19,12 +19,14 @@
package io.druid.segment;
+import io.druid.guice.annotations.PublicApi;
import org.joda.time.Interval;
import java.io.Closeable;
/**
*/
+@PublicApi
public interface Segment extends Closeable
{
public String getIdentifier();
diff --git a/processing/src/main/java/io/druid/segment/StorageAdapter.java b/processing/src/main/java/io/druid/segment/StorageAdapter.java
index 82b181a9bed1..62e3dfa250d2 100644
--- a/processing/src/main/java/io/druid/segment/StorageAdapter.java
+++ b/processing/src/main/java/io/druid/segment/StorageAdapter.java
@@ -19,16 +19,17 @@
package io.druid.segment;
+import io.druid.guice.annotations.PublicApi;
import io.druid.segment.column.ColumnCapabilities;
import io.druid.segment.data.Indexed;
import org.joda.time.DateTime;
import org.joda.time.Interval;
import javax.annotation.Nullable;
-import java.util.Map;
/**
*/
+@PublicApi
public interface StorageAdapter extends CursorFactory
{
public String getSegmentIdentifier();
@@ -63,8 +64,6 @@ public interface StorageAdapter extends CursorFactory
@Nullable
public ColumnCapabilities getColumnCapabilities(String column);
- public Map getDimensionHandlers();
-
/**
* Like {@link ColumnCapabilities#getType()}, but may return a more descriptive string for complex columns.
* @param column column name
diff --git a/processing/src/main/java/io/druid/segment/data/Indexed.java b/processing/src/main/java/io/druid/segment/data/Indexed.java
index 1f6ee2ebf1ca..a10cfd226211 100644
--- a/processing/src/main/java/io/druid/segment/data/Indexed.java
+++ b/processing/src/main/java/io/druid/segment/data/Indexed.java
@@ -19,9 +19,11 @@
package io.druid.segment.data;
+import io.druid.guice.annotations.PublicApi;
import io.druid.query.monomorphicprocessing.CalledFromHotLoop;
import io.druid.query.monomorphicprocessing.HotLoopCallee;
+@PublicApi
public interface Indexed extends Iterable, HotLoopCallee
{
Class extends T> getClazz();
diff --git a/processing/src/main/java/io/druid/segment/data/ObjectStrategy.java b/processing/src/main/java/io/druid/segment/data/ObjectStrategy.java
index a0ab34ba6bd2..dfcb60ed4434 100644
--- a/processing/src/main/java/io/druid/segment/data/ObjectStrategy.java
+++ b/processing/src/main/java/io/druid/segment/data/ObjectStrategy.java
@@ -19,9 +19,12 @@
package io.druid.segment.data;
+import io.druid.guice.annotations.ExtensionPoint;
+
import java.nio.ByteBuffer;
import java.util.Comparator;
+@ExtensionPoint
public interface ObjectStrategy extends Comparator
{
public Class extends T> getClazz();
diff --git a/processing/src/main/java/io/druid/segment/incremental/IncrementalIndexStorageAdapter.java b/processing/src/main/java/io/druid/segment/incremental/IncrementalIndexStorageAdapter.java
index e23b0e4d0fb6..50cf97df240d 100644
--- a/processing/src/main/java/io/druid/segment/incremental/IncrementalIndexStorageAdapter.java
+++ b/processing/src/main/java/io/druid/segment/incremental/IncrementalIndexStorageAdapter.java
@@ -35,7 +35,6 @@
import io.druid.query.monomorphicprocessing.RuntimeShapeInspector;
import io.druid.segment.Capabilities;
import io.druid.segment.Cursor;
-import io.druid.segment.DimensionHandler;
import io.druid.segment.DimensionIndexer;
import io.druid.segment.DimensionSelector;
import io.druid.segment.DoubleColumnSelector;
@@ -64,7 +63,6 @@
import javax.annotation.Nullable;
import java.util.Iterator;
-import java.util.Map;
/**
*/
@@ -173,12 +171,6 @@ public ColumnCapabilities getColumnCapabilities(String column)
return index.getCapabilities(column);
}
- @Override
- public Map getDimensionHandlers()
- {
- return index.getDimensionHandlers();
- }
-
@Override
public String getColumnTypeName(String column)
{
diff --git a/processing/src/main/java/io/druid/segment/serde/ComplexColumnSerializer.java b/processing/src/main/java/io/druid/segment/serde/ComplexColumnSerializer.java
index 9b97ceaa9022..a76878491009 100644
--- a/processing/src/main/java/io/druid/segment/serde/ComplexColumnSerializer.java
+++ b/processing/src/main/java/io/druid/segment/serde/ComplexColumnSerializer.java
@@ -19,6 +19,7 @@
package io.druid.segment.serde;
+import io.druid.guice.annotations.PublicApi;
import io.druid.java.util.common.StringUtils;
import io.druid.java.util.common.io.smoosh.FileSmoosher;
import io.druid.segment.GenericColumnSerializer;
@@ -46,6 +47,7 @@ public ComplexColumnSerializer(
this.strategy = strategy;
}
+ @PublicApi
public static ComplexColumnSerializer create(
IOPeon ioPeon,
String filenameBase,
diff --git a/processing/src/main/java/io/druid/segment/serde/ComplexMetricExtractor.java b/processing/src/main/java/io/druid/segment/serde/ComplexMetricExtractor.java
index 243b0999fcbb..37a8ea342489 100644
--- a/processing/src/main/java/io/druid/segment/serde/ComplexMetricExtractor.java
+++ b/processing/src/main/java/io/druid/segment/serde/ComplexMetricExtractor.java
@@ -20,9 +20,11 @@
package io.druid.segment.serde;
import io.druid.data.input.InputRow;
+import io.druid.guice.annotations.ExtensionPoint;
/**
*/
+@ExtensionPoint
public interface ComplexMetricExtractor
{
public Class> extractedClass();
diff --git a/processing/src/main/java/io/druid/segment/serde/ComplexMetricSerde.java b/processing/src/main/java/io/druid/segment/serde/ComplexMetricSerde.java
index 5a0d3418ac40..e0b2aaa662d8 100644
--- a/processing/src/main/java/io/druid/segment/serde/ComplexMetricSerde.java
+++ b/processing/src/main/java/io/druid/segment/serde/ComplexMetricSerde.java
@@ -20,6 +20,7 @@
package io.druid.segment.serde;
import com.google.common.base.Function;
+import io.druid.guice.annotations.ExtensionPoint;
import io.druid.segment.GenericColumnSerializer;
import io.druid.segment.column.ColumnBuilder;
import io.druid.segment.data.IOPeon;
@@ -29,6 +30,7 @@
/**
*/
+@ExtensionPoint
public abstract class ComplexMetricSerde
{
public abstract String getTypeName();
diff --git a/processing/src/main/java/io/druid/segment/serde/LargeColumnSupportedComplexColumnSerializer.java b/processing/src/main/java/io/druid/segment/serde/LargeColumnSupportedComplexColumnSerializer.java
index 888912da9b7e..f3c12d8a919f 100644
--- a/processing/src/main/java/io/druid/segment/serde/LargeColumnSupportedComplexColumnSerializer.java
+++ b/processing/src/main/java/io/druid/segment/serde/LargeColumnSupportedComplexColumnSerializer.java
@@ -19,6 +19,7 @@
package io.druid.segment.serde;
+import io.druid.guice.annotations.PublicApi;
import io.druid.java.util.common.StringUtils;
import io.druid.java.util.common.io.smoosh.FileSmoosher;
import io.druid.segment.GenericColumnSerializer;
@@ -58,6 +59,7 @@ public LargeColumnSupportedComplexColumnSerializer(
this.columnSize = columnSize;
}
+ @PublicApi
public static LargeColumnSupportedComplexColumnSerializer create(
IOPeon ioPeon,
String filenameBase,
diff --git a/server/src/main/java/io/druid/server/initialization/jetty/ServletFilterHolder.java b/server/src/main/java/io/druid/server/initialization/jetty/ServletFilterHolder.java
index d40a9bfba540..5566e98405ee 100644
--- a/server/src/main/java/io/druid/server/initialization/jetty/ServletFilterHolder.java
+++ b/server/src/main/java/io/druid/server/initialization/jetty/ServletFilterHolder.java
@@ -19,6 +19,8 @@
package io.druid.server.initialization.jetty;
+import io.druid.guice.annotations.ExtensionPoint;
+
import javax.servlet.DispatcherType;
import javax.servlet.Filter;
import java.util.EnumSet;
@@ -33,6 +35,7 @@
* Note that some of the druid nodes (router for example) use async servlets and your filter
* implementation should be able to handle those requests properly.
*/
+@ExtensionPoint
public interface ServletFilterHolder
{