final EdmFunctionImport functionImport, final Map<String, Object> functionImportParameters,
final List<NavigationSegment> navigationSegments) throws ODataException {
Object data;
final Map<String, Object> keys = mapKey(keyPredicates);
ODataContext context = getContext();
final int timingHandle = context.startRuntimeMeasurement(getClass().getSimpleName(), "retrieveData");
try {
data = functionImport == null ?
keys.isEmpty() ?
dataSource.readData(startEntitySet) : dataSource.readData(startEntitySet, keys) :
dataSource.readData(functionImport, functionImportParameters, keys);
EdmEntitySet currentEntitySet =
functionImport == null ? startEntitySet : functionImport.getEntitySet();
for (NavigationSegment navigationSegment : navigationSegments) {
data = dataSource.readRelatedData(
currentEntitySet,
data,
navigationSegment.getEntitySet(),
mapKey(navigationSegment.getKeyPredicates()));
currentEntitySet = navigationSegment.getEntitySet();
}
} finally {
context.stopRuntimeMeasurement(timingHandle);
}
return data;
}