function selectCountSkipTop(aRows, mQueryOptions, oResponse) {
		const aSelect = mQueryOptions.$select.split(",");

		function select(oNode) {
			const oResult = {};
			for (const sSelect of aSelect) {
				oResult[sSelect] = sSelect === "DescendantCount" || sSelect === "DistanceFromRoot"
					? "" + oNode[sSelect] // Edm.Int64
					: oNode[sSelect];
			}
			return oResult;
		}

		const oMessage = {};
		if ("$count" in mQueryOptions) {
			oMessage["@odata.count"] = "" + aRows.length;
		}
		const iSkip = "$skip" in mQueryOptions ? parseInt(mQueryOptions.$skip) : 0;
		const iTop = "$top" in mQueryOptions ? parseInt(mQueryOptions.$top) : Infinity;
		// Note: bSkipCopy due to select
		oMessage.value = update(aRows.slice(iSkip, iSkip + iTop).map(select), true);
		oResponse.message = JSON.stringify(oMessage);
	}
Fills the given response object from the given list of rows, taking $select, $count, $skip,
and $top into account.

@param {object[]} aRows - List of row objects to build the response from
@param {Object<string>} mQueryOptions - Map of (system) query options (names to values)
@param {object} oResponse - Response object to fill