In Gremlin-Java, g.V().has(a).has(b).has(c).out() is originally represented as [GraphStep,HasStep(a),HasStep(b),HasStep(c),VertexStep]. Ultimately, InlineFilterStrategy or most provider strategies will turn such HasStep-chains into [GraphStep,HasStep(a,b,c),VertexStep]. That is, strategies fold has()-steps "left" and delete "right" has()-steps and left propagates their labels (i.e. clock cycles). I think that GraphTraversal should simply do this:
In essence, a "write time" optimization can be done. Given that chains of has()'s is super common, this can save significant clock-cycles in the long run of a production application.