Join a row generator into (row, Node()) tuples.

        A row generator yields tuples of node buid, rawprop dict

        Args:
            rows: A generator of (layer_idx, (buid, ...)) tuples.
            rawprop(str):  "raw" propname e.g. if a tag, starts with "#".  Used
                for filtering so that we skip the props for a buid if we're
                asking from a higher layer than the row was from (and hence,
                we'll presumable get/have gotten the row when that layer is
                lifted.
            cmpf (func): A comparison function used to filter nodes.
        Yields:
            (tuple): (row, node)

async def getRowNodes(self, rows, rawprop, cmpf=None):
        '''
        Join a row generator into (row, Node()) tuples.

        A row generator yields tuples of node buid, rawprop dict

        Args:
            rows: A generator of (layer_idx, (buid, ...)) tuples.
            rawprop(str):  "raw" propname e.g. if a tag, starts with "#".  Used
                for filtering so that we skip the props for a buid if we're
                asking from a higher layer than the row was from (and hence,
                we'll presumable get/have gotten the row when that layer is
                lifted.
            cmpf (func): A comparison function used to filter nodes.
        Yields:
            (tuple): (row, node)
        '''
        count = 0
        async for origlayer, row in rows:
            count += 1
            if not count % 5:
                await asyncio.sleep(0)  # give other tasks some time

            buid, rawprops = row
            node = self.livenodes.get(buid)

            if node is None:
                props = {}     # rawprop: valu
                proplayr = {}  # rawprop: layr

                for layeridx, layr in enumerate(self.layers):

                    if layeridx == origlayer:
                        layerprops = rawprops
                    else:
                        layerprops = await layr.getBuidProps(buid)

                    props.update(layerprops)
                    proplayr.update({k: layr for k in layerprops})

                node = s_node.Node(self, buid, props.items(), proplayr=proplayr)
                if node.ndef is None:
                    continue

                # Add node to my buidcache
                self.buidcache.append(node)
                self.livenodes[buid] = node

            # If the node's prop I'm filtering on came from a different layer, skip it
            rawrawprop = ('*' if rawprop == node.form.name else '') + rawprop
            if node.proplayr[rawrawprop] != self.layers[origlayer]:
                continue

            if cmpf:
                if rawprop == node.form.name:
                    valu = node.ndef[1]
                else:
                    valu = node.get(rawprop)
                if valu is None:
                    # cmpr required to evaluate something; cannot know if this
                    # node is valid or not without the prop being present.
                    continue
                if not cmpf(valu):
                    continue

            yield row, node