override def features()

in s2core/src/main/scala/org/apache/s2graph/core/S2GraphLike.scala [84:238]


  override def features() = s2Features

  def fallback = Future.successful(StepResult.Empty)

  def defaultStorage: Storage

  def getStorage(service: Service): Storage

  def getStorage(label: Label): Storage

  def getVertexFetcher(column: ServiceColumn): VertexFetcher

  def getEdgeFetcher(label: Label): EdgeFetcher

  def getAllVertexFetchers(): Seq[VertexFetcher]

  def getAllEdgeFetchers(): Seq[EdgeFetcher]

  /** optional */
  def getOptimisticEdgeFetcher(label: Label): OptimisticEdgeFetcher

  def getEdgeMutator(label: Label): EdgeMutator

  def getVertexMutator(column: ServiceColumn): VertexMutator

  def flushStorage(): Unit

  def shutdown(modelDataDelete: Boolean = false): Unit

  def getVertices(vertices: Seq[S2VertexLike]): Future[Seq[S2VertexLike]]

  def getVertices(queryParam: VertexQueryParam): Future[Seq[S2VertexLike]]

  def checkEdges(edges: Seq[S2EdgeLike]): Future[StepResult]

  def checkEdgesJava(edges: util.List[S2EdgeLike]): CompletableFuture[StepResult] =
    checkEdges(edges.asScala).toJava.toCompletableFuture

  def mutateVertices(vertices: Seq[S2VertexLike], withWait: Boolean = false): Future[Seq[MutateResponse]]

  def mutateVerticesJava(vertices: util.List[S2VertexLike], withWait: JBoolean): CompletableFuture[util.List[MutateResponse]] =
    mutateVertices(vertices.asScala, withWait.booleanValue()).map(_.asJava).toJava.toCompletableFuture

  def mutateEdges(edges: Seq[S2EdgeLike], withWait: Boolean = false): Future[Seq[MutateResponse]]

  def mutateEdgesJava(edges: util.List[S2EdgeLike], withWait: JBoolean): CompletableFuture[util.List[MutateResponse]] =
    mutateEdges(edges.asScala, withWait.booleanValue()).map(_.asJava).toJava.toCompletableFuture

  def mutateElements(elements: Seq[GraphElement],
                     withWait: Boolean = false): Future[Seq[MutateResponse]]

  def mutateElementsJava(elements: util.List[GraphElement], withWait: JBoolean): CompletableFuture[util.List[MutateResponse]] =
    mutateElements(elements.asScala, withWait.booleanValue()).map(_.asJava).toJava.toCompletableFuture

  def getEdges(q: Query): Future[StepResult]

  def getEdgesJava(q: Query): CompletableFuture[StepResult] =
    getEdges(q).toJava.toCompletableFuture

  def getEdgesMultiQuery(mq: MultiQuery): Future[StepResult]

  def getEdgesMultiQueryJava(mq: MultiQuery): CompletableFuture[StepResult] =
    getEdgesMultiQuery(mq).toJava.toCompletableFuture

  def deleteAllAdjacentEdges(srcVertices: Seq[S2VertexLike],
                             labels: Seq[Label],
                             dir: Int,
                             ts: Long): Future[Boolean]

  def deleteAllAdjacentEdgesJava(srcVertices: util.List[S2VertexLike], labels: util.List[Label], direction: Direction): CompletableFuture[JBoolean] =
    deleteAllAdjacentEdges(srcVertices.asScala, labels.asScala, GraphUtil.toDirection(direction), System.currentTimeMillis()).map(JBoolean.valueOf(_)).toJava.toCompletableFuture

  def incrementCounts(edges: Seq[S2EdgeLike], withWait: Boolean): Future[Seq[MutateResponse]]

  def incrementCountsJava(edges: util.List[S2EdgeLike], withWait: JBoolean): CompletableFuture[util.List[MutateResponse]] =
    incrementCounts(edges.asScala, withWait.booleanValue()).map(_.asJava).toJava.toCompletableFuture

  def updateDegree(edge: S2EdgeLike, degreeVal: Long = 0): Future[MutateResponse]

  def updateDegreeJava(edge: S2EdgeLike, degreeVal: JLong): CompletableFuture[MutateResponse] =
    updateDegree(edge, degreeVal.longValue()).toJava.toCompletableFuture

  def getVertex(vertexId: VertexId): Option[S2VertexLike]

  def getVertexJava(vertexId: VertexId): Optional[S2VertexLike] =
    getVertex(vertexId).asJava

  def fetchEdges(vertex: S2VertexLike, labelNameWithDirs: Seq[(String, String)]): util.Iterator[Edge]

  def fetchEdgesJava(vertex: S2VertexLike, labelNameWithDirs: util.List[(String, String)]): util.Iterator[Edge] =
    fetchEdges(vertex, labelNameWithDirs.asScala)

  def edgesAsync(vertex: S2VertexLike, direction: Direction, labelNames: String*): Future[util.Iterator[Edge]]

  def edgesAsyncJava(vertex: S2VertexLike, direction: Direction, labelNames: String*): CompletableFuture[util.Iterator[Edge]] =
    edgesAsync(vertex, direction, labelNames: _*).toJava.toCompletableFuture

  /** Convert to Graph Element **/
  def toVertex(serviceName: String,
               columnName: String,
               id: Any,
               props: Map[String, Any] = Map.empty,
               ts: Long = System.currentTimeMillis(),
               operation: String = "insert"): S2VertexLike =
    elementBuilder.toVertex(serviceName, columnName, id, props, ts, operation)

  def toEdge(srcId: Any,
             tgtId: Any,
             labelName: String,
             direction: String,
             props: Map[String, Any] = Map.empty,
             ts: Long = System.currentTimeMillis(),
             operation: String = "insert"): S2EdgeLike =
    elementBuilder.toEdge(srcId, tgtId, labelName, direction, props, ts, operation)

  def toGraphElement(s: String, labelMapping: Map[String, String] = Map.empty): Option[GraphElement] =
    elementBuilder.toGraphElement(s, labelMapping)

  /** TinkerPop Interfaces **/
  def vertices(ids: AnyRef*): util.Iterator[structure.Vertex] = {
    val fetchVertices = ids.lastOption.map { lastParam =>
      if (lastParam.isInstanceOf[Boolean]) lastParam.asInstanceOf[Boolean]
      else true
    }.getOrElse(true)

    if (ids.isEmpty) {
      //TODO: default storage need to be fixed.
      val futures = (defaultStorage.vertexFetcher +: getAllVertexFetchers).map { vertexFetcher =>
        vertexFetcher.fetchVerticesAll()
      }

      val future = Future.sequence(futures)

      Await.result(future, WaitTimeout).flatten.iterator
    } else {
      val vertexIds = ids.collect {
        case s2Vertex: S2VertexLike => s2Vertex.id
        case vId: VertexId => vId
        case vertex: Vertex => vertex.id().asInstanceOf[VertexId]
        case other@_ => VertexId.fromString(other.toString)
      }

      if (fetchVertices) {
        val queryParam = VertexQueryParam(vertexIds = vertexIds)
        val future = getVertices(queryParam).map { vs =>
          val ls = new util.ArrayList[structure.Vertex]()
          ls.addAll(vs)
          ls.iterator()
        }
        Await.result(future, WaitTimeout)
      } else {
        vertexIds.map(vId => elementBuilder.newVertex(vId)).iterator
      }
    }
  }