private SourcesTarget getOrRegisterSourceTarget(ComponentId sourceId) {
            Target sourcesTarget = targets.getComponent(sourceId);
            if (sourcesTarget == null) {
                targets.register(sourceId, new SourcesTarget(sourceId));
                return getOrRegisterSourceTarget(sourceId);
            } else if (sourcesTarget instanceof SourcesTarget) {
                return (SourcesTarget) sourcesTarget;
            } else {
                throw new IllegalStateException("Expected " + sourceId + " to be a source.");
            }
        }
Resolves (source, provider) component specifications to a search chain invocation spec.
The provider component specification is given by the entry in the queryMap with key
'source.&lt;source-name&gt;.provider'.

<p>
The diagram shows the relationship between source, provider and the result:
(source is used to select row, provider is used to select column.)
Provider id = null is used for regular search chains.
</p>

<pre>
                  Provider id
                null
               |----+---+---+---|
               | o  |   |   |   |
               |----+---+---+---|
Source id      |    | o | o |   |
               |----+---+---+---|
               |    |   |   | o |
               |----+---+---+---|

                   o: SearchChainInvocationSpec
</pre>

@author Tony Vaagenes
container-search/src/main/java/com/yahoo/search/federation/sourceref/SearchChainResolver.java