Package | Description |
---|---|
org.apache.flink.graph.scala |
Modifier and Type | Method and Description |
---|---|
Graph<K,VV,EV> |
Graph.addEdge(Vertex<K,VV> source,
Vertex<K,VV> target,
EV edgeValue)
Adds the given edge to the graph.
|
Graph<K,VV,EV> |
Graph.addEdges(scala.collection.immutable.List<Edge<K,EV>> edges)
Adds the given list edges to the graph.
|
Graph<K,VV,EV> |
Graph.addVertex(Vertex<K,VV> vertex)
Adds the input vertex to the graph.
|
Graph<K,VV,EV> |
Graph.addVertices(scala.collection.immutable.List<Vertex<K,VV>> vertices)
Adds the list of vertices, passed as input, to the graph.
|
Graph<K,VV,EV> |
Graph.difference(Graph<K,VV,EV> graph)
Performs Difference on the vertex and edge sets of the input graphs
removes common vertices and edges.
|
Graph<K,VV,EV> |
Graph.filterOnEdges(FilterFunction<Edge<K,EV>> edgeFilter)
Apply a filtering function to the graph and return a sub-graph that
satisfies the predicates only for the edges.
|
Graph<K,VV,EV> |
Graph.filterOnEdges(scala.Function1<Edge<K,EV>,Object> edgeFilterFun)
Apply a filtering function to the graph and return a sub-graph that
satisfies the predicates only for the edges.
|
Graph<K,VV,EV> |
Graph.filterOnVertices(FilterFunction<Vertex<K,VV>> vertexFilter)
Apply a filtering function to the graph and return a sub-graph that
satisfies the predicates only for the vertices.
|
Graph<K,VV,EV> |
Graph.filterOnVertices(scala.Function1<Vertex<K,VV>,Object> vertexFilterFun)
Apply a filtering function to the graph and return a sub-graph that
satisfies the predicates only for the vertices.
|
<K,EV> Graph<K,NullValue,EV> |
Graph$.fromCollection(scala.collection.Seq<Edge<K,EV>> edges,
ExecutionEnvironment env,
TypeInformation<K> evidence$23,
scala.reflect.ClassTag<K> evidence$24,
TypeInformation<EV> evidence$25,
scala.reflect.ClassTag<EV> evidence$26)
Creates a Graph from a Seq of edges.
|
static <K,EV> Graph<K,NullValue,EV> |
Graph.fromCollection(scala.collection.Seq<Edge<K,EV>> edges,
ExecutionEnvironment env,
TypeInformation<K> evidence$23,
scala.reflect.ClassTag<K> evidence$24,
TypeInformation<EV> evidence$25,
scala.reflect.ClassTag<EV> evidence$26)
Creates a Graph from a Seq of edges.
|
<K,VV,EV> Graph<K,VV,EV> |
Graph$.fromCollection(scala.collection.Seq<Edge<K,EV>> edges,
MapFunction<K,VV> vertexValueInitializer,
ExecutionEnvironment env,
TypeInformation<K> evidence$27,
scala.reflect.ClassTag<K> evidence$28,
TypeInformation<VV> evidence$29,
scala.reflect.ClassTag<VV> evidence$30,
TypeInformation<EV> evidence$31,
scala.reflect.ClassTag<EV> evidence$32)
Creates a graph from a Seq of edges.
|
static <K,VV,EV> Graph<K,VV,EV> |
Graph.fromCollection(scala.collection.Seq<Edge<K,EV>> edges,
MapFunction<K,VV> vertexValueInitializer,
ExecutionEnvironment env,
TypeInformation<K> evidence$27,
scala.reflect.ClassTag<K> evidence$28,
TypeInformation<VV> evidence$29,
scala.reflect.ClassTag<VV> evidence$30,
TypeInformation<EV> evidence$31,
scala.reflect.ClassTag<EV> evidence$32)
Creates a graph from a Seq of edges.
|
<K,VV,EV> Graph<K,VV,EV> |
Graph$.fromCollection(scala.collection.Seq<Vertex<K,VV>> vertices,
scala.collection.Seq<Edge<K,EV>> edges,
ExecutionEnvironment env,
TypeInformation<K> evidence$17,
scala.reflect.ClassTag<K> evidence$18,
TypeInformation<VV> evidence$19,
scala.reflect.ClassTag<VV> evidence$20,
TypeInformation<EV> evidence$21,
scala.reflect.ClassTag<EV> evidence$22)
Creates a Graph from a Seq of vertices and a Seq of edges.
|
static <K,VV,EV> Graph<K,VV,EV> |
Graph.fromCollection(scala.collection.Seq<Vertex<K,VV>> vertices,
scala.collection.Seq<Edge<K,EV>> edges,
ExecutionEnvironment env,
TypeInformation<K> evidence$17,
scala.reflect.ClassTag<K> evidence$18,
TypeInformation<VV> evidence$19,
scala.reflect.ClassTag<VV> evidence$20,
TypeInformation<EV> evidence$21,
scala.reflect.ClassTag<EV> evidence$22)
Creates a Graph from a Seq of vertices and a Seq of edges.
|
<K,VV,EV> Graph<K,VV,EV> |
Graph$.fromCsvReader(ExecutionEnvironment env,
String pathEdges,
String pathVertices,
String lineDelimiterVertices,
String fieldDelimiterVertices,
Character quoteCharacterVertices,
boolean ignoreFirstLineVertices,
String ignoreCommentsVertices,
boolean lenientVertices,
int[] includedFieldsVertices,
String lineDelimiterEdges,
String fieldDelimiterEdges,
Character quoteCharacterEdges,
boolean ignoreFirstLineEdges,
String ignoreCommentsEdges,
boolean lenientEdges,
int[] includedFieldsEdges,
MapFunction<K,VV> vertexValueInitializer,
TypeInformation<K> evidence$55,
scala.reflect.ClassTag<K> evidence$56,
TypeInformation<VV> evidence$57,
scala.reflect.ClassTag<VV> evidence$58,
TypeInformation<EV> evidence$59,
scala.reflect.ClassTag<EV> evidence$60)
Creates a Graph from a CSV file of edges.
|
static <K,VV,EV> Graph<K,VV,EV> |
Graph.fromCsvReader(ExecutionEnvironment env,
String pathEdges,
String pathVertices,
String lineDelimiterVertices,
String fieldDelimiterVertices,
Character quoteCharacterVertices,
boolean ignoreFirstLineVertices,
String ignoreCommentsVertices,
boolean lenientVertices,
int[] includedFieldsVertices,
String lineDelimiterEdges,
String fieldDelimiterEdges,
Character quoteCharacterEdges,
boolean ignoreFirstLineEdges,
String ignoreCommentsEdges,
boolean lenientEdges,
int[] includedFieldsEdges,
MapFunction<K,VV> vertexValueInitializer,
TypeInformation<K> evidence$55,
scala.reflect.ClassTag<K> evidence$56,
TypeInformation<VV> evidence$57,
scala.reflect.ClassTag<VV> evidence$58,
TypeInformation<EV> evidence$59,
scala.reflect.ClassTag<EV> evidence$60)
Creates a Graph from a CSV file of edges.
|
<K,EV> Graph<K,NullValue,EV> |
Graph$.fromDataSet(DataSet<Edge<K,EV>> edges,
ExecutionEnvironment env,
TypeInformation<K> evidence$7,
scala.reflect.ClassTag<K> evidence$8,
TypeInformation<EV> evidence$9,
scala.reflect.ClassTag<EV> evidence$10)
Creates a Graph from a DataSet of edges.
|
static <K,EV> Graph<K,NullValue,EV> |
Graph.fromDataSet(DataSet<Edge<K,EV>> edges,
ExecutionEnvironment env,
TypeInformation<K> evidence$7,
scala.reflect.ClassTag<K> evidence$8,
TypeInformation<EV> evidence$9,
scala.reflect.ClassTag<EV> evidence$10)
Creates a Graph from a DataSet of edges.
|
<K,VV,EV> Graph<K,VV,EV> |
Graph$.fromDataSet(DataSet<Edge<K,EV>> edges,
MapFunction<K,VV> vertexValueInitializer,
ExecutionEnvironment env,
TypeInformation<K> evidence$11,
scala.reflect.ClassTag<K> evidence$12,
TypeInformation<VV> evidence$13,
scala.reflect.ClassTag<VV> evidence$14,
TypeInformation<EV> evidence$15,
scala.reflect.ClassTag<EV> evidence$16)
Creates a graph from a DataSet of edges.
|
static <K,VV,EV> Graph<K,VV,EV> |
Graph.fromDataSet(DataSet<Edge<K,EV>> edges,
MapFunction<K,VV> vertexValueInitializer,
ExecutionEnvironment env,
TypeInformation<K> evidence$11,
scala.reflect.ClassTag<K> evidence$12,
TypeInformation<VV> evidence$13,
scala.reflect.ClassTag<VV> evidence$14,
TypeInformation<EV> evidence$15,
scala.reflect.ClassTag<EV> evidence$16)
Creates a graph from a DataSet of edges.
|
<K,VV,EV> Graph<K,VV,EV> |
Graph$.fromDataSet(DataSet<Vertex<K,VV>> vertices,
DataSet<Edge<K,EV>> edges,
ExecutionEnvironment env,
TypeInformation<K> evidence$1,
scala.reflect.ClassTag<K> evidence$2,
TypeInformation<VV> evidence$3,
scala.reflect.ClassTag<VV> evidence$4,
TypeInformation<EV> evidence$5,
scala.reflect.ClassTag<EV> evidence$6)
Creates a Graph from a DataSet of vertices and a DataSet of edges.
|
static <K,VV,EV> Graph<K,VV,EV> |
Graph.fromDataSet(DataSet<Vertex<K,VV>> vertices,
DataSet<Edge<K,EV>> edges,
ExecutionEnvironment env,
TypeInformation<K> evidence$1,
scala.reflect.ClassTag<K> evidence$2,
TypeInformation<VV> evidence$3,
scala.reflect.ClassTag<VV> evidence$4,
TypeInformation<EV> evidence$5,
scala.reflect.ClassTag<EV> evidence$6)
Creates a Graph from a DataSet of vertices and a DataSet of edges.
|
<K> Graph<K,NullValue,NullValue> |
Graph$.fromTuple2DataSet(DataSet<scala.Tuple2<K,K>> edges,
ExecutionEnvironment env,
TypeInformation<K> evidence$49,
scala.reflect.ClassTag<K> evidence$50)
Creates a Graph from a DataSet of Tuple2's representing the edges.
|
static <K> Graph<K,NullValue,NullValue> |
Graph.fromTuple2DataSet(DataSet<scala.Tuple2<K,K>> edges,
ExecutionEnvironment env,
TypeInformation<K> evidence$49,
scala.reflect.ClassTag<K> evidence$50)
Creates a Graph from a DataSet of Tuple2's representing the edges.
|
<K,VV> Graph<K,VV,NullValue> |
Graph$.fromTuple2DataSet(DataSet<scala.Tuple2<K,K>> edges,
MapFunction<K,VV> vertexValueInitializer,
ExecutionEnvironment env,
TypeInformation<K> evidence$51,
scala.reflect.ClassTag<K> evidence$52,
TypeInformation<VV> evidence$53,
scala.reflect.ClassTag<VV> evidence$54)
Creates a Graph from a DataSet of Tuple2's representing the edges.
|
static <K,VV> Graph<K,VV,NullValue> |
Graph.fromTuple2DataSet(DataSet<scala.Tuple2<K,K>> edges,
MapFunction<K,VV> vertexValueInitializer,
ExecutionEnvironment env,
TypeInformation<K> evidence$51,
scala.reflect.ClassTag<K> evidence$52,
TypeInformation<VV> evidence$53,
scala.reflect.ClassTag<VV> evidence$54)
Creates a Graph from a DataSet of Tuple2's representing the edges.
|
<K,VV,EV> Graph<K,VV,EV> |
Graph$.fromTupleDataSet(DataSet<scala.Tuple2<K,VV>> vertices,
DataSet<scala.Tuple3<K,K,EV>> edges,
ExecutionEnvironment env,
TypeInformation<K> evidence$33,
scala.reflect.ClassTag<K> evidence$34,
TypeInformation<VV> evidence$35,
scala.reflect.ClassTag<VV> evidence$36,
TypeInformation<EV> evidence$37,
scala.reflect.ClassTag<EV> evidence$38)
Creates a graph from DataSets of tuples for vertices and for edges.
|
static <K,VV,EV> Graph<K,VV,EV> |
Graph.fromTupleDataSet(DataSet<scala.Tuple2<K,VV>> vertices,
DataSet<scala.Tuple3<K,K,EV>> edges,
ExecutionEnvironment env,
TypeInformation<K> evidence$33,
scala.reflect.ClassTag<K> evidence$34,
TypeInformation<VV> evidence$35,
scala.reflect.ClassTag<VV> evidence$36,
TypeInformation<EV> evidence$37,
scala.reflect.ClassTag<EV> evidence$38)
Creates a graph from DataSets of tuples for vertices and for edges.
|
<K,EV> Graph<K,NullValue,EV> |
Graph$.fromTupleDataSet(DataSet<scala.Tuple3<K,K,EV>> edges,
ExecutionEnvironment env,
TypeInformation<K> evidence$39,
scala.reflect.ClassTag<K> evidence$40,
TypeInformation<EV> evidence$41,
scala.reflect.ClassTag<EV> evidence$42)
Creates a Graph from a DataSet of Tuples representing the edges.
|
static <K,EV> Graph<K,NullValue,EV> |
Graph.fromTupleDataSet(DataSet<scala.Tuple3<K,K,EV>> edges,
ExecutionEnvironment env,
TypeInformation<K> evidence$39,
scala.reflect.ClassTag<K> evidence$40,
TypeInformation<EV> evidence$41,
scala.reflect.ClassTag<EV> evidence$42)
Creates a Graph from a DataSet of Tuples representing the edges.
|
<K,VV,EV> Graph<K,VV,EV> |
Graph$.fromTupleDataSet(DataSet<scala.Tuple3<K,K,EV>> edges,
MapFunction<K,VV> vertexValueInitializer,
ExecutionEnvironment env,
TypeInformation<K> evidence$43,
scala.reflect.ClassTag<K> evidence$44,
TypeInformation<VV> evidence$45,
scala.reflect.ClassTag<VV> evidence$46,
TypeInformation<EV> evidence$47,
scala.reflect.ClassTag<EV> evidence$48)
Creates a Graph from a DataSet of Tuples representing the edges.
|
static <K,VV,EV> Graph<K,VV,EV> |
Graph.fromTupleDataSet(DataSet<scala.Tuple3<K,K,EV>> edges,
MapFunction<K,VV> vertexValueInitializer,
ExecutionEnvironment env,
TypeInformation<K> evidence$43,
scala.reflect.ClassTag<K> evidence$44,
TypeInformation<VV> evidence$45,
scala.reflect.ClassTag<VV> evidence$46,
TypeInformation<EV> evidence$47,
scala.reflect.ClassTag<EV> evidence$48)
Creates a Graph from a DataSet of Tuples representing the edges.
|
Graph<K,VV,EV> |
Graph.getUndirected()
This operation adds all inverse-direction edges to the graph.
|
Graph<K,NullValue,EV> |
Graph.intersect(Graph<K,VV,EV> graph,
boolean distinctEdges)
Performs intersect on the edge sets of the input graphs.
|
<T> Graph<K,VV,EV> |
Graph.joinWithEdges(DataSet<scala.Tuple3<K,K,T>> inputDataSet,
EdgeJoinFunction<EV,T> edgeJoinFunction,
TypeInformation<T> evidence$89)
Joins the edge DataSet with an input DataSet on the composite key of both
source and target IDs and applies a user-defined transformation on the values
of the matched records.
|
<T> Graph<K,VV,EV> |
Graph.joinWithEdges(DataSet<scala.Tuple3<K,K,T>> inputDataSet,
scala.Function2<EV,T,EV> fun,
TypeInformation<T> evidence$90)
Joins the edge DataSet with an input DataSet on the composite key of both
source and target IDs and applies a user-defined transformation on the values
of the matched records.
|
<T> Graph<K,VV,EV> |
Graph.joinWithEdgesOnSource(DataSet<scala.Tuple2<K,T>> inputDataSet,
EdgeJoinFunction<EV,T> edgeJoinFunction,
TypeInformation<T> evidence$91)
Joins the edge DataSet with an input Tuple2 DataSet and applies a user-defined transformation
on the values of the matched records.
|
<T> Graph<K,VV,EV> |
Graph.joinWithEdgesOnSource(DataSet<scala.Tuple2<K,T>> inputDataSet,
scala.Function2<EV,T,EV> fun,
TypeInformation<T> evidence$92)
Joins the edge DataSet with an input Tuple2 DataSet and applies a user-defined transformation
on the values of the matched records.
|
<T> Graph<K,VV,EV> |
Graph.joinWithEdgesOnTarget(DataSet<scala.Tuple2<K,T>> inputDataSet,
EdgeJoinFunction<EV,T> edgeJoinFunction,
TypeInformation<T> evidence$93)
Joins the edge DataSet with an input Tuple2 DataSet and applies a user-defined transformation
on the values of the matched records.
|
<T> Graph<K,VV,EV> |
Graph.joinWithEdgesOnTarget(DataSet<scala.Tuple2<K,T>> inputDataSet,
scala.Function2<EV,T,EV> fun,
TypeInformation<T> evidence$94)
Joins the edge DataSet with an input Tuple2 DataSet and applies a user-defined transformation
on the values of the matched records.
|
<T> Graph<K,VV,EV> |
Graph.joinWithVertices(DataSet<scala.Tuple2<K,T>> inputDataSet,
scala.Function2<VV,T,VV> fun,
TypeInformation<T> evidence$88)
Joins the vertex DataSet of this graph with an input Tuple2 DataSet and applies
a user-defined transformation on the values of the matched records.
|
<T> Graph<K,VV,EV> |
Graph.joinWithVertices(DataSet<scala.Tuple2<K,T>> inputDataSet,
VertexJoinFunction<VV,T> vertexJoinFunction,
TypeInformation<T> evidence$87)
Joins the vertex DataSet of this graph with an input Tuple2 DataSet and applies
a user-defined transformation on the values of the matched records.
|
<NV> Graph<K,VV,NV> |
Graph.mapEdges(scala.Function1<Edge<K,EV>,NV> fun,
TypeInformation<NV> evidence$73,
scala.reflect.ClassTag<NV> evidence$74)
Apply a function to the attribute of each edge in the graph.
|
<NV> Graph<K,VV,NV> |
Graph.mapEdges(MapFunction<Edge<K,EV>,NV> mapper,
TypeInformation<NV> evidence$71,
scala.reflect.ClassTag<NV> evidence$72)
Apply a function to the attribute of each edge in the graph.
|
<NV> Graph<K,NV,EV> |
Graph.mapVertices(scala.Function1<Vertex<K,VV>,NV> fun,
TypeInformation<NV> evidence$69,
scala.reflect.ClassTag<NV> evidence$70)
Apply a function to the attribute of each vertex in the graph.
|
<NV> Graph<K,NV,EV> |
Graph.mapVertices(MapFunction<Vertex<K,VV>,NV> mapper,
TypeInformation<NV> evidence$67,
scala.reflect.ClassTag<NV> evidence$68)
Apply a function to the attribute of each vertex in the graph.
|
Graph<K,VV,EV> |
Graph.removeEdge(Edge<K,EV> edge)
Removes all edges that match the given edge from the graph.
|
Graph<K,VV,EV> |
Graph.removeEdges(scala.collection.immutable.List<Edge<K,EV>> edges)
Removes all the edges that match the edges in the given data set from the graph.
|
Graph<K,VV,EV> |
Graph.removeVertex(Vertex<K,VV> vertex)
Removes the given vertex and its edges from the graph.
|
Graph<K,VV,EV> |
Graph.removeVertices(scala.collection.immutable.List<Vertex<K,VV>> vertices)
Removes the given vertex and its edges from the graph.
|
Graph<K,VV,EV> |
Graph.reverse()
Reverse the direction of the edges in the graph
|
<M> Graph<K,VV,EV> |
Graph.runGatherSumApplyIteration(GatherFunction<VV,EV,M> gatherFunction,
SumFunction<VV,EV,M> sumFunction,
ApplyFunction<K,VV,M> applyFunction,
int maxIterations)
Runs a Gather-Sum-Apply iteration on the graph.
|
<M> Graph<K,VV,EV> |
Graph.runGatherSumApplyIteration(GatherFunction<VV,EV,M> gatherFunction,
SumFunction<VV,EV,M> sumFunction,
ApplyFunction<K,VV,M> applyFunction,
int maxIterations,
GSAConfiguration parameters)
Runs a Gather-Sum-Apply iteration on the graph with configuration options.
|
<M> Graph<K,VV,EV> |
Graph.runScatterGatherIteration(ScatterFunction<K,VV,M,EV> scatterFunction,
GatherFunction<K,VV,M> gatherFunction,
int maxIterations)
Runs a scatter-gather iteration on the graph.
|
<M> Graph<K,VV,EV> |
Graph.runScatterGatherIteration(ScatterFunction<K,VV,M,EV> scatterFunction,
GatherFunction<K,VV,M> gatherFunction,
int maxIterations,
ScatterGatherConfiguration parameters)
Runs a scatter-gather iteration on the graph with configuration options.
|
<M> Graph<K,VV,EV> |
Graph.runVertexCentricIteration(ComputeFunction<K,VV,EV,M> computeFunction,
MessageCombiner<K,M> combineFunction,
int maxIterations)
Runs a vertex-centric iteration on the graph.
|
<M> Graph<K,VV,EV> |
Graph.runVertexCentricIteration(ComputeFunction<K,VV,EV,M> computeFunction,
MessageCombiner<K,M> combineFunction,
int maxIterations,
VertexCentricConfiguration parameters)
Runs a vertex-centric iteration on the graph with configuration options.
|
Graph<K,VV,EV> |
Graph.subgraph(FilterFunction<Vertex<K,VV>> vertexFilter,
FilterFunction<Edge<K,EV>> edgeFilter)
Apply filtering functions to the graph and return a sub-graph that
satisfies the predicates for both vertices and edges.
|
Graph<K,VV,EV> |
Graph.subgraph(scala.Function1<Vertex<K,VV>,Object> vertexFilterFun,
scala.Function1<Edge<K,EV>,Object> edgeFilterFun)
Apply filtering functions to the graph and return a sub-graph that
satisfies the predicates for both vertices and edges.
|
<NEW> Graph<K,VV,NEW> |
Graph.translateEdgeValues(scala.Function2<EV,NEW,NEW> fun,
TypeInformation<NEW> evidence$85,
scala.reflect.ClassTag<NEW> evidence$86)
Translate edge values using the given function.
|
<NEW> Graph<K,VV,NEW> |
Graph.translateEdgeValues(TranslateFunction<EV,NEW> translator,
TypeInformation<NEW> evidence$83,
scala.reflect.ClassTag<NEW> evidence$84)
Translate edge values using the given MapFunction.
|
<NEW> Graph<NEW,VV,EV> |
Graph.translateGraphIds(scala.Function2<K,NEW,NEW> fun,
TypeInformation<NEW> evidence$77,
scala.reflect.ClassTag<NEW> evidence$78)
Translate vertex and edge IDs using the given function.
|
<NEW> Graph<NEW,VV,EV> |
Graph.translateGraphIds(TranslateFunction<K,NEW> translator,
TypeInformation<NEW> evidence$75,
scala.reflect.ClassTag<NEW> evidence$76)
Translate vertex and edge IDs using the given MapFunction.
|
<NEW> Graph<K,NEW,EV> |
Graph.translateVertexValues(scala.Function2<VV,NEW,NEW> fun,
TypeInformation<NEW> evidence$81,
scala.reflect.ClassTag<NEW> evidence$82)
Translate vertex values using the given function.
|
<NEW> Graph<K,NEW,EV> |
Graph.translateVertexValues(TranslateFunction<VV,NEW> translator,
TypeInformation<NEW> evidence$79,
scala.reflect.ClassTag<NEW> evidence$80)
Translate vertex values using the given MapFunction.
|
Graph<K,VV,EV> |
Graph.union(Graph<K,VV,EV> graph)
Performs union on the vertices and edges sets of the input graphs
removing duplicate vertices but maintaining duplicate edges.
|
Modifier and Type | Method and Description |
---|---|
Graph<K,VV,EV> |
Graph.difference(Graph<K,VV,EV> graph)
Performs Difference on the vertex and edge sets of the input graphs
removes common vertices and edges.
|
Graph<K,NullValue,EV> |
Graph.intersect(Graph<K,VV,EV> graph,
boolean distinctEdges)
Performs intersect on the edge sets of the input graphs.
|
Graph<K,VV,EV> |
Graph.union(Graph<K,VV,EV> graph)
Performs union on the vertices and edges sets of the input graphs
removing duplicate vertices but maintaining duplicate edges.
|
Copyright © 2014–2018 The Apache Software Foundation. All rights reserved.