Как скопировать эту функцию NodeJS в PostgreSQL? - PullRequest
0 голосов
/ 03 октября 2019

Недавно я создал функцию в NodeJS, которая позволяет фильтровать данные по долготе и широте. Теперь мне нужно воспроизвести эту функцию в PostgreSQL, но это становится очень сложно, потому что я не очень часто использую этот язык. Мне нужно получить длину массива после фильтрации. Я использую postgreSQL V9.4

// My NodeJS Function
filters(dataT, indx) {
        indx = indx || 1;
        let dataTGroup = [];
        dataT.forEach(row => {
            if (dataTGroup.length > 0) {
                const lastIndex = dataTGroup.length - 1;
                const previous = dataTGroup[lastIndex];
                if ((row.lon === previous.lon && row.lat === previous.lat) 
                && (previous.pan !== true 
                && !(previous.veh === false && previous.par !== null) 
                && previous.eve === null) 
                && row.enc === previous.enc) {
                    if ((previous.cal > 0) || (previous.seg > 0)) {
                        //
                    } else {
                        dataTGroup.pop();
                    }
                }
            }
            dataTGroup.push(row);
        });

        let plus = 0;
        let errors = 0;
        let total = [];

        if (indx) {
            total = dataTGroup.map(row => {
                row.index = ++plus;
                return row;
            });
        } else {
            dataTGroup.forEach((row) => {
                if (row.lon !== null && row.lat !== null) {
                    row.index = (plus += row.group) + errors;
                    total.push(row);
                } else {
                    ++errors;
                }
            });
        }
        return total;
    }

Некоторый код в postgreSQL, который я пытался сделать для репликации функции.

Пытаюсь повторить его как Select

SELECT json_agg(                                                                                                                                                                                                                        
    json_build_object(
      'cal', rep.cal,
      ...)) as tests
FROM ((SELECT ( 
        SELECT array_agg('{"id":' || rep || ','
          '"id_ag":' || age ||
          ...})
        FROM gen.ev_ag ea WHERE ea.id = 65 AND ea.id_r = x.id_r) AS eve,
      (SELECT '{"fecha_registro":"' || fec_reg::date || '",
       "es_vehiculo_movimiento":' || veh || ',
       "tiempo_transcurrido":"' || tie_tra || '"}'
       FROM gen.paradas_marcha pm WHERE pm.rep = x.rep GROUP BY rep, fec_reg::date, veh, tie_tra) AS par,
      cal,
      seg,
      pan,
      enc,
      veh,
      CASE
      WHEN st_x(the_geom) is null then null
      ELSE ROUND(st_x(the_geom)::numeric,6)
      END lon,
      CASE
      WHEN st_y(the_geom) is null then null
      ELSE ROUND(st_y(the_geom)::numeric,6)
  END lat
  -- Another function that I call to get the data
  FROM gen.f_data('rep = 1 and usu= 65 and date >= ''2019-05-18''::timestamp  AND date < ''2019-05-19''::timestamp') x
  ) as rep

Попытка воспроизвести его как функцию

CREATE OR REPLACE FUNCTION est.replicate()                                                                                                                                                                                              
  RETURNS integer AS
  $BODY$
  DECLARE
  _test   integer;
  BEGIN
  WITH test AS(SELECT (
        SELECT array_agg('{"id":' || rep || ','
          '"id_ag":' || age ||
          ...})
        FROM gen.ev_ag ea WHERE ea.id = 65 AND ea.id_r = x.id_r) AS eve,
      (SELECT '{"fecha_registro":"' || fec_reg::date || '",
       "es_vehiculo_movimiento":' || veh || ',
       "tiempo_transcurrido":"' || tie_tra || '"}'
       FROM gen.paradas_marcha pm WHERE pm.rep = x.rep GROUP BY rep, fec_reg::date, veh, tie_tra) AS par,
      cal,
      seg,
      pan,
      enc,
      veh,
      CASE
      WHEN st_x(the_geom) is null then null
      ELSE ROUND(st_x(the_geom)::numeric,6)
      END lon,
      CASE
      WHEN st_y(the_geom) is null then null
      ELSE ROUND(st_y(the_geom)::numeric,6)
  END lat
  FROM gen.f_data('rep = 1 and usu= 65 and date >= ''2019-05-18''::timestamp  AND date < ''2019-05-19''::timestamp') x)
  SELECT COUNT(*) INTO _test FROM test;
  RETURN _test;
  END;
  $BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
...