función de llamada dentro del generador de consultas

8

Tengo una entidad de ubicación con coordenadas. Según un radio, quiero obtener todas las ubicaciones que estén dentro del alcance.

Creé una función (código de backend / lógica de Nestjs, no base de datos) que calcula la distancia entre dos ubicaciones. Si la distancia calculada es menor o igual al radio, quiero seleccionar esta ubicación.

Mi implementación actual de repositorio usando esta función de cálculo de distancia:

// ...
import { distanceFromCoordinatesInKilometers } from '../shared/calculations/distanceFromCoordinatesInKilometers';

@EntityRepository(Location)
export class LocationsRepository extends Repository<Location> {
    public getLocations({ /* ... */ latitude, longitude, radiusInKilometers }: GetLocationsDTO): Promise<Location[]> {
        const query: SelectQueryBuilder<Location> = this.createQueryBuilder('location');

        // ....

        if(latitude && longitude && radiusInKilometers) {
             query.andWhere("distanceFromCoordinatesInKilometers(location.latitude, location.longitude, :latitude, :longitude) <= :radiusInKilometers", { 
                 latitude,
                 longitude,
                 radiusInKilometers, 
            });
        }

        return query.getMany();
    }
}

El ejemplo que se muestra arriba no funciona. Me sale este error

QueryFailedError: la función distanceFromCoordinatesInKilometers (precisión doble, precisión doble, desconocido, desconocido) no existe

Al agregar un :a la función me sale este error

El parámetro de función no es compatible con los parámetros. Por favor verifique el parámetro "distancia".

¿Cómo llamaría a mi función de código de fondo distanceFromCoordinatesInKilometersdentro de esa consulta? ¿Puedo pasar variables pero no funciones?

Actualmente estoy usando una base de datos Postgres, pero sería increíble si hubiera una solución independiente.

Pregunta3r
fuente
2
básicamente está intentando llamar una función desde su node.jsaplicación desde la base de datos, eso nunca funcionará, una solución universal sería: implementar esa función en la base de datos (por ejemplo, por migraciones), o una solución más independiente del controlador: implementar esa función en su consulta
Amplio
gracias, pero ¿cómo implementaría esa función en mi consulta? El cálculo en sí es grande (30 líneas de código)
Question3r
1
Su pregunta es más relacionados con SQL que la propia TypeORM, pero suponiendo que está utilizando un gran círculo básicas de cálculo echar un vistazo a que el GIST gist.github.com/rugbyprof/...
Amplio
gracias por ese enlace Traté de traducirlo aquí pastebin.com/AS7y7efr y no obtuve ningún error. Pero tengo que verificar si ese cálculo es correcto ...
Question3r
1
¿Has mirado la extensión PostGIS para PostgreSQL? Contiene funcionalidad para determinar distancias entre coordenadas (puntos). Consulte gis.stackexchange.com/questions/77072/… para ver algunos ejemplos de cómo lograr una consulta que filtre filas dentro de una distancia especificada desde una coordenada suministrada.
Timshel

Respuestas:

0

OK Si tuviera que implementar lo siguiente en su código, debe evaluar la función antes de pasarla a la cadena SQL. Tan simplemente:

if(latitude && longitude && radiusInKilometers) {
             query.andWhere(`${distanceFromCoordinatesInKilometers(location.latitude, location.longitude, :latitude, :longitude)} <= :radiusInKilometers`, { 
                 latitude,
                 longitude,
                 radiusInKilometers, 
            });
        }
bluejayke
fuente
lo siento, no entendí tu respuesta. Este es un proyecto NestJs (Nodo con TS) que usa TypeORM. ¿Qué debo hacer en mi código?
Question3r
@ Question3r C edit
bluejayke
lo siento, pero esto no funcionará porque la función no sabe acerca de los valores actuales de latlong que provienen de la tabla de la base de datos aquílocation.latitude, location.longitude
Question3r