示例#1
0
    def using(self, *fields):
        if not fields:
            raise JoinException("Parameter 'fields' is required when joining with "
                                "a using clause but was not supplied.".format(type=self.type_label))

        self.query.do_join(JoinUsing(self.item, self.how, [Field(field) for field in fields]))
        return self.query
示例#2
0
    def on(self, criterion):
        if criterion is None:
            raise JoinException("Parameter 'criterion' is required for a "
                                "{type} JOIN but was not supplied.".format(type=self.type_label))

        self.query.do_join(JoinOn(self.item, self.how, criterion))
        return self.query
示例#3
0
    def on(self, criterion):
        if criterion is None:
            raise JoinException("Parameter 'on' is required when joining a "
                                "{type} but was not supplied.".format(type=self.type_label))

        self.query.do_join(self.item, criterion, self.how)
        return self.query
示例#4
0
 def _validate_term(self, term):
     for field in term.fields():
         if (field.table is not None
             and field.table != self._from
             and field.table not in [join.item for join in self._joins]):
             raise JoinException('Table [%s] missing from query.  '
                                 'Table must be first joined before any of '
                                 'its fields can be used' % field.table)
 def _validate_term(self, term):
     for field in term.fields():
         table_in_froms = field.table in self._from
         table_in_joins = field.table in [join.item for join in self._joins]
         if field.table is not None and not table_in_froms and not table_in_joins:
             raise JoinException('Table [%s] missing from query.  '
                                 'Table must be first joined before any of '
                                 'its fields can be used' % field.table)
示例#6
0
 def validate(self, _from, _joins):
     criterion_tables = set([f.table for f in self.criterion.fields()])
     available_tables = (set(_from) | {join.item for join in _joins} | {self.item})
     missing_tables = criterion_tables - available_tables
     if missing_tables:
         raise JoinException('Invalid join criterion. One field is required from the joined item and '
                             'another from the selected table or an existing join.  Found [{tables}]'.format(
               tables=', '.join(map(str, missing_tables))
         ))
示例#7
0
    def on_field(self, *fields):
        if not fields:
            raise JoinException("Parameter 'fields' is required for a "
                                "{type} JOIN but was not supplied.".format(type=self.type_label))

        criterion = None
        for field in fields:
            consituent = Field(field, table=self.query._from[0]) == Field(field, table=self.item)
            criterion = consituent if criterion is None else criterion & consituent

        self.query.do_join(JoinOn(self.item, self.how, criterion))
        return self.query
示例#8
0
    def _validate_term(self, term):
        base_tables = self._from + [self._update_table]

        for field in term.fields():
            table_in_base_tables = field.table in base_tables
            table_in_joins = field.table in [join.item for join in self._joins]
            if field.table is not None \
                  and not table_in_base_tables \
                  and not table_in_joins \
                  and field.table != self._update_table:
                raise JoinException('Table [%s] missing from query.  '
                                    'Table must be first joined before any of '
                                    'its fields can be used' % field.table)