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
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
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
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)
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)) ))
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
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)