Hi all,

I would like to discuss this idea for TinkerPop 4.

# Proposal: Provider-focused interfaces for efficient data retrieval

When building Gremlin providers - whether connecting to remote databases,
in‐memory stores, or custom backends - there’s a recurring challenge:
TinkerPop’s core traversal engine asks for full element payloads, while
many providers only need subsets of data (selected properties or specific
edge directions) to satisfy a step. This mismatch leads to:

- Unnecessary data transfer or object materialization
- Wasted CPU cycles filtering out unused fields
- Hard-to-maintain provider code packed with ad hoc “if this step needs X,
fetch Y” logic

Introducing three lightweight interfaces - `PropertiesProcessor`,
`AdjacentProcessor`, and `ElementReader` - offers a clean extension point
that lives in provider code without bloating the TinkerPop core.

---

## Proposed Interfaces

```java
public interface PropertiesProcessor {
    enum PropertiesRequirement {
        NONE,
        CUSTOM,
        ALL,
    }

    // second value is properties
    Pair<PropertiesRequirement,String> getPropertiesRequirement();
}

public interface AdjacentProcessor {
    enum AdjacentRequirement {
        NONE,
        IN,
        OUT,
        BOTH
    }

    // second value is edge labels. Null if all labels are required.
    Pair<AdjacentRequirement, String> getAdjacentRequirement();
}

public interface ElementReader {
    void setElementRequirement(Pair<PropertiesRequirement, String>
propertiesRequirement,
                               Pair<AdjacentRequirement, String>
adjacentRequirement);
}
```

---

## Why This Helps Providers

- **Performance Gains**
  By knowing exactly which properties and adjacent edges are required,
providers can:
  - Send targeted queries to the backend (e.g., read only needed
columns/properties)
  - Avoid loading full element metadata into memory
  - Reduce network bandwidth for remote stores

- **Clear Separation of Concerns**
  Core TinkerPop remains focused on traversal semantics. Providers
implement these interfaces to translate greedy element requests into
optimized backend calls.

- **Consistent Extension Point**
  Instead of scattering `if (step instanceof X)` checks across provider
code, every step that implements `PropertiesProcessor` or
`AdjacentProcessor` exposes its requirements via the same API.

- **Easier Maintenance & Evolution**
  Future provider enhancements - like supporting richer filters or
push-down queries - build upon these interfaces. There’s no need to touch
core TinkerPop logic, only provider‐side readers.

---

## Impact on TinkerPop Core

- No new dependencies in the core module
- Default behavior: if a step doesn’t implement these interfaces, providers
fall back to fetching full elements

---

## Conclusion

Adding `PropertiesProcessor`, `AdjacentProcessor`, and `ElementReader` as
provider‐focused interfaces creates a lightweight, uniform way for Gremlin
providers to express data needs. This yields measurable performance
improvements, cleaner code, and a more maintainable separation between
TinkerPop’s traversal engine and its many backend implementations.

Thank you,
Valentyn

Reply via email to