blob: a5349dc24ae86bc9be2c926aa8471586fc67c9b2 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.s2graph.core.index
import org.apache.s2graph.core.Integrate.IntegrateCommon
import org.apache.s2graph.core._
import org.apache.tinkerpop.gremlin.process.traversal.step.util.HasContainer
import org.apache.tinkerpop.gremlin.process.traversal.{Order, P}
import org.apache.s2graph.core.mysqls._
import org.apache.s2graph.core.types.{InnerVal, InnerValLikeWithTs}
import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper
import org.apache.tinkerpop.gremlin.structure.T
import scala.collection.JavaConversions._
import scala.concurrent._
import scala.concurrent.duration._
class IndexProviderTest extends IntegrateCommon {
import scala.concurrent.ExecutionContext.Implicits.global
val indexProvider = IndexProvider(config)
val numOfTry = 1
test("test vertex write/query") {
import TestUtil._
val testService = Service.findByName(TestUtil.testServiceName).get
val testColumn = ServiceColumn.find(testService.id.get, TestUtil.testColumnName).get
val vertexId = graph.elementBuilder.newVertexId(testServiceName)(testColumnName)(1L)
val indexPropsColumnMeta = testColumn.metasInvMap("age")
val propsWithTs = Map(
indexPropsColumnMeta -> InnerVal.withInt(1, "v4")
)
val otherPropsWithTs = Map(
indexPropsColumnMeta -> InnerVal.withInt(2, "v4")
)
val vertex = graph.elementBuilder.newVertex(vertexId)
S2Vertex.fillPropsWithTs(vertex, propsWithTs)
val otherVertex = graph.elementBuilder.newVertex(vertexId)
S2Vertex.fillPropsWithTs(otherVertex, otherPropsWithTs)
val numOfOthers = 20
val vertices = Seq(vertex) ++ (10 until numOfOthers).map { ith =>
val vertexId = graph.elementBuilder.newVertexId(testServiceName)(testColumnName)(ith)
val v = graph.elementBuilder.newVertex(vertexId)
S2Vertex.fillPropsWithTs(v, otherPropsWithTs)
v
}
println(s"[# of vertices]: ${vertices.size}")
vertices.foreach(v => println(s"[Vertex]: $v, ${v.props}"))
indexProvider.mutateVertices(vertices, forceToIndex = true)
// enough time for elastic search to persist docs.
Thread.sleep(1000)
(0 until numOfTry).foreach { ith =>
// val hasContainer = new HasContainer(indexPropsColumnMeta.name, P.eq(Long.box(1)))
val hasContainer = new HasContainer(GlobalIndex.serviceColumnField, P.eq(testColumn.columnName))
val f = graph.searchVertices(VertexQueryParam(0, 100, Option(s"${GlobalIndex.serviceColumnField}:${testColumn.columnName}")))
val a = Await.result(f, Duration("60 sec"))
println(a)
// var ids = indexProvider.fetchVertexIds(Seq(hasContainer))
// ids.head shouldBe vertex.id
//
// ids.foreach { id =>
// println(s"[Id]: $id")
// }
}
}
test("test edge write/query ") {
import TestUtil._
val testLabelName = TestUtil.testLabelName
val testLabel = Label.findByName(testLabelName).getOrElse(throw new IllegalArgumentException)
val vertexId = graph.elementBuilder.newVertexId(testServiceName)(testColumnName)(1L)
val otherVertexId = graph.elementBuilder.newVertexId(testServiceName)(testColumnName)(2L)
val vertex = graph.elementBuilder.newVertex(vertexId)
val otherVertex = graph.elementBuilder.newVertex(otherVertexId)
val weightMeta = testLabel.metaPropsInvMap("weight")
val timeMeta = testLabel.metaPropsInvMap("time")
val propsWithTs = Map(
weightMeta -> InnerValLikeWithTs.withLong(1L, 1L, "v4"),
timeMeta -> InnerValLikeWithTs.withLong(10L, 1L, "v4")
)
val otherPropsWithTs = Map(
weightMeta -> InnerValLikeWithTs.withLong(2L, 2L, "v4"),
timeMeta -> InnerValLikeWithTs.withLong(20L, 2L, "v4")
)
val edge = graph.elementBuilder.newEdge(vertex, vertex, testLabel, 0, propsWithTs = propsWithTs)
val otherEdge = graph.elementBuilder.newEdge(otherVertex, otherVertex, testLabel, 0, propsWithTs = otherPropsWithTs)
val numOfOthers = 10
val edges = Seq(edge) ++ (0 until numOfOthers).map(_ => otherEdge)
println(s"[# of edges]: ${edges.size}")
edges.foreach(e => println(s"[Edge]: $e"))
indexProvider.mutateEdges(edges, forceToIndex = true)
// enough time for elastic search to persist docs.
Thread.sleep(1000)
// match
(0 until numOfTry).foreach { _ =>
val hasContainers = Seq(new HasContainer(timeMeta.name, P.eq(Int.box(10))),
new HasContainer(weightMeta.name, P.eq(Int.box(1))))
val ids = indexProvider.fetchEdgeIds(hasContainers)
ids.head shouldBe edge.edgeId
ids.foreach { id =>
println(s"[Id]: $id")
}
}
// match and not
(0 until numOfTry).foreach { _ =>
val hasContainers = Seq(new HasContainer(timeMeta.name, P.eq(Int.box(20))),
new HasContainer(weightMeta.name, P.neq(Int.box(1))))
val ids = indexProvider.fetchEdgeIds(hasContainers)
// ids.size shouldBe 0
// distinct make ids size to 1
// ids.size shouldBe numOfOthers
ids.foreach { id =>
id shouldBe otherEdge.edgeId
println(s"[Id]: $id")
}
}
// range
(0 until numOfTry).foreach { _ =>
val hasContainers = Seq(new HasContainer(timeMeta.name,
P.inside(Int.box(0), Int.box(11))))
val ids = indexProvider.fetchEdgeIds(hasContainers)
// ids.size shouldBe 0
ids.size shouldBe 1
ids.foreach { id =>
id shouldBe edge.edgeId
println(s"[Id]: $id")
}
}
}
test("buildQuerySingleString") {
// (weight: 34) AND (weight: [0.5 TO *] AND price: 30)
var hasContainer = new HasContainer("weight", P.eq(Double.box(0.5)))
var queryString = IndexProvider.buildQuerySingleString(hasContainer)
println(s"[[QueryString]]: ${queryString}")
hasContainer = new HasContainer("weight", P.gte(Double.box(0.5)))
queryString = IndexProvider.buildQuerySingleString(hasContainer)
println(s"[[QueryString]]: ${queryString}")
hasContainer = new HasContainer("weight", P.within(Double.box(0.5), Double.box(0.7)))
queryString = IndexProvider.buildQuerySingleString(hasContainer)
println(s"[[QueryString]]: ${queryString}")
hasContainer = new HasContainer("weight", P.without(Double.box(0.5), Double.box(0.7)))
queryString = IndexProvider.buildQuerySingleString(hasContainer)
println(s"[[QueryString]]: ${queryString}")
}
test("buildQueryString") {
// (weight: 34) AND (weight: [1 TO 100])
var hasContainers = Seq(
new HasContainer("weight", P.eq(Int.box(34))),
new HasContainer("weight", P.between(Int.box(1), Int.box(100)))
)
var queryString = IndexProvider.buildQueryString(hasContainers)
println(s"[[QueryString]: ${queryString}")
hasContainers = Seq(
new HasContainer("weight", P.eq(Int.box(34))),
new HasContainer("weight", P.outside(Int.box(1), Int.box(100)))
)
queryString = IndexProvider.buildQueryString(hasContainers)
println(s"[[QueryString]: ${queryString}")
}
test("complex.") {
//val predicate = P.lte(10).and(P.between(11, 20)) // .and(P.lt(29).or(P.eq(35)))
val predicate = P.eq(30).and(P.between(11, 20)) // .and(P.lt(29).or(P.eq(35)))
/*
(x = 30 and x >= 11 and x < 20)
//
((x <= 10 and (x >= 11 and x < 20)) and (x < 29 or x = 35))
(and
(lte 10)
(and
(between 11, 20))
(or
(lt 29)
(eq 35))
)
)
)
(x:[* TO 10] OR x:10) AND ((x:[11 TO *] AND x:[* TO 20]) AND (x:[* TO 29] OR x:35))
((x:[* TO 10] OR x:10) AND x:[11 TO *] AND x:[* TO 20] AND (x:[* TO 29] OR x:35))
*/
val hasContainers = Seq(new HasContainer("x", predicate))
val queryString = IndexProvider.buildQueryString(hasContainers)
println(s"[[QueryString]: ${queryString}")
}
test("has label") {
// has("song", "name", "OH BOY").out("followedBy").out("followedBy").order.by("performances").by("songType", Order.decr)
val hasContainers = Seq(new HasContainer(T.label.getAccessor, P.eq("song")),
new HasContainer("name", P.eq("OH BOY")))
val queryString = IndexProvider.buildQueryString(hasContainers)
println(s"[[QueryString]: ${queryString}")
}
}