Ejemplo n.º 1
0
 def process_rhs(self, compiler, connection):
     value = self.rhs
     if self.bilateral_transforms:
         if self.rhs_is_direct_value():
             # Do not call get_db_prep_lookup here as the value will be
             # transformed before being used for lookup
             value = Value(value, output_field=self.lhs.output_field)
         value = self.apply_bilateral_transforms(value)
         value = value.resolve_expression(compiler.query)
     if hasattr(value, 'as_sql'):
         sql, params = compiler.compile(value)
         return '(' + sql + ')', params
     else:
         return self.get_db_prep_lookup(value, connection)
Ejemplo n.º 2
0
 def batch_process_rhs(self, compiler, connection, rhs=None):
     if rhs is None:
         rhs = self.rhs
     if self.bilateral_transforms:
         sqls, sqls_params = [], []
         for p in rhs:
             value = Value(p, output_field=self.lhs.output_field)
             value = self.apply_bilateral_transforms(value)
             value = value.resolve_expression(compiler.query)
             sql, sql_params = compiler.compile(value)
             sqls.append(sql)
             sqls_params.extend(sql_params)
     else:
         _, params = self.get_db_prep_lookup(rhs, connection)
         sqls, sqls_params = ['%s'] * len(params), params
     return sqls, sqls_params
Ejemplo n.º 3
0
    def as_postgresql(self, compiler, connection):
        clone = self.copy()
        function = None
        expr2 = clone.source_expressions[1]
        geography = self.source_is_geography()
        if expr2.output_field.geography != geography:
            if isinstance(expr2, Value):
                expr2.output_field.geography = geography
            else:
                clone.source_expressions[1] = Cast(
                    expr2,
                    GeometryField(srid=expr2.output_field.srid,
                                  geography=geography),
                )

        if not geography and self.geo_field.geodetic(connection):
            # Geometry fields with geodetic (lon/lat) coordinates need special distance functions
            if self.spheroid:
                # DistanceSpheroid is more accurate and resource intensive than DistanceSphere
                function = connection.ops.spatial_function_name(
                    'DistanceSpheroid')
                # Replace boolean param by the real spheroid of the base field
                clone.source_expressions.append(
                    Value(self.geo_field.spheroid(connection)))
            else:
                function = connection.ops.spatial_function_name(
                    'DistanceSphere')
        return super(Distance, clone).as_sql(compiler,
                                             connection,
                                             function=function)
Ejemplo n.º 4
0
 def __init__(self, *expressions, **extra):
     super().__init__(*expressions, **extra)
     self.config = self.extra.get('config', self.config)
     weight = self.extra.get('weight')
     if weight is not None and not hasattr(weight, 'resolve_expression'):
         weight = Value(weight)
     self.weight = weight
Ejemplo n.º 5
0
 def as_postgresql(self, compiler, connection):
     clone = self.copy()
     function = None
     if self.source_is_geography():
         clone.source_expressions.append(Value(self.spheroid))
     elif self.geo_field.geodetic(connection):
         # Geometry fields with geodetic (lon/lat) coordinates need length_spheroid
         function = connection.ops.spatial_function_name('LengthSpheroid')
         clone.source_expressions.append(
             Value(self.geo_field.spheroid(connection)))
     else:
         dim = min(f.dim for f in self.get_source_fields() if f)
         if dim > 2:
             function = connection.ops.length3d
     return super(Length, clone).as_sql(compiler,
                                        connection,
                                        function=function)
Ejemplo n.º 6
0
 def __init__(self, vector, query, **extra):
     if not hasattr(vector, 'resolve_expression'):
         vector = SearchVector(vector)
     if not hasattr(query, 'resolve_expression'):
         query = SearchQuery(query)
     weights = extra.get('weights')
     if weights is not None and not hasattr(weights, 'resolve_expression'):
         weights = Value(weights)
     self.weights = weights
     super().__init__(vector, query, **extra)
Ejemplo n.º 7
0
 def resolve_expression(self,
                        query=None,
                        allow_joins=True,
                        reuse=None,
                        summarize=False,
                        for_save=False):
     resolved = super().resolve_expression(query, allow_joins, reuse,
                                           summarize, for_save)
     if self.config:
         if not hasattr(self.config, 'resolve_expression'):
             resolved.config = Value(self.config).resolve_expression(
                 query, allow_joins, reuse, summarize, for_save)
         else:
             resolved.config = self.config.resolve_expression(
                 query, allow_joins, reuse, summarize, for_save)
     return resolved
Ejemplo n.º 8
0
    def __init__(self, *expressions, **extra):
        super().__init__(*expressions, **extra)

        # Ensure that value expressions are geometric.
        for pos in self.geom_param_pos:
            expr = self.source_expressions[pos]
            if not isinstance(expr, Value):
                continue
            try:
                output_field = expr.output_field
            except FieldError:
                output_field = None
            geom = expr.value
            if not isinstance(geom,
                              GEOSGeometry) or output_field and not isinstance(
                                  output_field, GeometryField):
                raise TypeError(
                    "%s function requires a geometric argument in position %d."
                    % (self.name, pos + 1))
            if not geom.srid and not output_field:
                raise ValueError("SRID is required for all geometries.")
            if not output_field:
                self.source_expressions[pos] = Value(
                    geom, output_field=GeometryField(srid=geom.srid))
Ejemplo n.º 9
0
 def test_cast_from_value(self):
     numbers = Author.objects.annotate(cast_integer=Cast(Value('0'), models.IntegerField()))
     self.assertEqual(numbers.get().cast_integer, 0)
Ejemplo n.º 10
0
 def as_sqlite(self, compiler, connection):
     clone = self.copy()
     if len(self.source_expressions) < 4:
         # Always provide the z parameter for ST_Translate
         clone.source_expressions.append(Value(0))
     return super(Translate, clone).as_sqlite(compiler, connection)
Ejemplo n.º 11
0
 def as_mysql(self, compiler, connection):
     clone = self.copy()
     # If no precision is provided, set it to the maximum.
     if len(clone.source_expressions) < 2:
         clone.source_expressions.append(Value(100))
     return clone.as_sql(compiler, connection)
Ejemplo n.º 12
0
 def __init__(self, expression, string, **extra):
     if not hasattr(string, 'resolve_expression'):
         string = Value(string)
     super().__init__(expression, string, **extra)