public fetchEdgeVertexPairs()

in src/Explorer/Graph/GraphExplorerComponent/GraphExplorer.tsx [503:561]


  public fetchEdgeVertexPairs(
    outE: boolean,
    vertex: GraphData.GremlinVertex,
    startIndex: number,
    pageSize: number,
  ): Q.Promise<EdgeVertexPair[]> {
    if (startIndex < 0) {
      const error = `Attempt to fetch edge-vertex pairs with negative index: outE:${outE}, vertex id:${vertex.id}, startIndex:${startIndex}, pageSize:${pageSize}`;
      GraphExplorer.reportToConsole(ConsoleDataType.Error, error);
      throw error;
    }

    // Try hitting cache first
    const cache = outE ? this.outECache : this.inECache;
    const pairs = cache.retrieve(vertex.id, startIndex, pageSize);
    if (pairs !== null && pairs.length === pageSize) {
      const msg = `Retrieved ${pairs.length} ${outE ? "outE" : "inE"} edges from cache for vertex id: ${vertex.id}`;
      GraphExplorer.reportToConsole(ConsoleDataType.Info, msg);
      return Q.resolve(pairs);
    }

    const excludedEdgeIds = outE ? vertex._outEdgeIds : vertex._inEdgeIds;
    const gremlinQuery = GraphUtil.createFetchEdgePairQuery(
      outE,
      this.getPkIdFromVertex(vertex),
      excludedEdgeIds,
      startIndex,
      pageSize,
      GraphExplorer.WITHOUT_STEP_ARGS_MAX_CHARS,
    );

    return this.submitToBackend(gremlinQuery).then((result: GremlinClient.GremlinRequestResult) => {
      const data = result.data;
      if (data === null) {
        const error = `Failed to load incoming edge/pairs for ${vertex.id} (query result is null)`;
        GraphExplorer.reportToConsole(ConsoleDataType.Error, error);
        throw error;
      }

      // Check if result is an array of edge/vertex pairs
      if (!GraphExplorer.isEdgeVertexPairArray(data)) {
        const error = `Failed to load incoming edge/pairs for ${vertex.id} (query result not a valid array of edge/vertex pairs)`;
        GraphExplorer.reportToConsole(ConsoleDataType.Error, error, data);
        throw error;
      }

      // Cache result
      const pairs = data as EdgeVertexPair[];
      for (let i = 0; i < pairs.length; i++) {
        const pair = pairs[i];
        cache.insert(vertex.id, startIndex + i, pair);

        // Merge with possible cached edge information
        this.edgeInfoCache.mergeEdgeInfo(pair.v);
      }

      return pairs;
    });
  }