def __call__()

in aliyun/log/etl_core/trans_comp/trans_lookup.py [0:0]


    def __call__(self, event, inpt):
        inpt = self._u(inpt)

        if isinstance(self.data, DefaultDict):
            # simple dict mode
            if isinstance(inpt, (six.binary_type, six.text_type)):
                inpt = [inpt]

            if isinstance(inpt, Iterable):
                for i in inpt:
                    if not isinstance(i, (six.binary_type, six.text_type)):
                        logger.error(u'trans_comp_lookup: type of input field "{0}" is unknown'.format(i))
                        continue

                    if i not in event:
                        logger.info(u'trans_comp_lookup: event "{0}" doesn not contain field "{1}"'.format(event, i))
                        continue

                    # get input value
                    f_v = event[i]

                    # set output value
                    for f_n in self.output_fields:
                        if f_v in self.data:
                            self.set(event, f_n, self.data[f_v])
                        else:
                            logger.info(u'trans_comp_lookup: value {0} not exit in lookup {1}'.format(f_v, self.data))
            else:
                logger.error(u"trans_comp_lookup: unknown type of input field {0}".format(inpt))
        else:
            # lookup type
            if isinstance(inpt, (six.binary_type, six.text_type)):
                inpt = [inpt]

            if isinstance(inpt, Iterable):
                inpt_map = {}
                for i in inpt:
                    if not isinstance(i, (six.binary_type, six.text_type, list, tuple)):
                        logger.error(u'trans_comp_lookup: type of input field "{0}" is unknown'.format(i))
                        # must exit, or else skip it for lookup type
                        return event

                    if isinstance(i, (tuple, list)) and len(i) != 2:
                        logger.error(u'trans_comp_lookup: type of input field "{0}" is unsupported'.format(i))
                        # must exit, or else skip it for lookup type
                        return event

                    if isinstance(i, (six.binary_type, six.text_type)):
                        i = (i, i)

                    if i[0] not in event:
                        logger.info(u'trans_comp_lookup: event "{0}" doesn not contain field "{1}"'.format(event, i[0]))
                        # must exit, or else skip it for lookup type
                        return event

                    inpt_map[i[1]] = event[i[0]]

                row = self.data.get_row(inpt_map)
                if row is None:
                    logger.info(
                        u'trans_comp_lookup: cannot find proper value for inpt "{0}" in event "{0}" doesn not contain field "{1}"'.format(
                            inpt_map, event))
                    return event

                for f, f_new in six.iteritems(self.output_fields):
                    if f in row:
                        self.set(event, f_new, row[f])
                    else:
                        logger.info(u"trans_comp_lookup: field {0} doesn't exit in lookup row {1}".format(f, row))

            else:
                logger.error(u"trans_comp_lookup: unknown type of input field {0}".format(inpt))

        return event