commit 8c00b38fb8bdbe3628c6566a811dc738ce90ad1f
parent 36cd7f60c1f747a8698578c2436062b4057fb7c7
Author: Christian Grothoff <grothoff@gnunet.org>
Date: Sat, 22 Mar 2025 14:08:41 +0100
-misc bug fixes
Diffstat:
2 files changed, 44 insertions(+), 35 deletions(-)
diff --git a/src/backenddb/pg_statistics_examples.sql b/src/backenddb/pg_statistics_examples.sql
@@ -22,9 +22,9 @@
BEGIN;
-- Check patch versioning is in place.
-SELECT _v.register_patch('example-statistics-0001', NULL, NULL);
+-- SELECT _v.register_patch('example-statistics-0001', NULL, NULL);
-CREATE SCHEMA example_statistics;
+-- CREATE SCHEMA example_statistics;
SET search_path TO example_statistics,merchant;
@@ -155,5 +155,14 @@ CREATE TRIGGER merchant_products_on_sold
ON merchant_inventory
FOR EACH ROW EXECUTE FUNCTION merchant_products_sold_statistics_trigger();
+call merchant_do_bump_number_stat ('products-sold'::text, 6, CURRENT_TIMESTAMP(0)::TIMESTAMP, 1);
-COMMIT;
+call merchant_do_bump_amount_stat ('deposits'::text, 6, CURRENT_TIMESTAMP(0)::TIMESTAMP, (2,2,'EUR')::taler_amount_currency);
+
+select * from merchant_statistic_interval_number_get ('deposits', 'default');
+
+select * from merchant_statistic_interval_amount_get ('deposits', 'default');
+
+
+
+ROLLBACK;
diff --git a/src/backenddb/pg_statistics_helpers.sql b/src/backenddb/pg_statistics_helpers.sql
@@ -20,7 +20,7 @@ CREATE OR REPLACE FUNCTION interval_to_start (
IN in_timestamp TIMESTAMP,
IN in_range statistic_range,
OUT out_bucket_start INT8
-)
+)
LANGUAGE plpgsql
AS $$
BEGIN
@@ -414,15 +414,6 @@ DECLARE
my_delta INT8;
my_meta INT8;
my_instance_id INT8;
- my_curs CURSOR (meta_serial_id INT8,instid INT8,range INT8,min_serial INT8) FOR
- SELECT nevent_serial_id
- ,delta
- FROM merchant_statistic_counter_event
- WHERE imeta_serial_id = meta_serial_id
- AND merchant_serial = instid
- AND slot < my_time - range
- AND imeta_serial_id >= min_serial
- ORDER BY slot ASC;
my_rec RECORD;
my_irec RECORD;
my_i INT;
@@ -465,17 +456,20 @@ BEGIN
my_max_serial = my_irec.event_delimiter;
my_rval.rvalue = my_rval.rvalue + my_irec.cumulative_number;
- my_delta = 0;
- OPEN my_curs (meta_serial_id := my_meta, range := my_range, instid := my_instance_id, min_serial := my_max_serial);
- LOOP
- FETCH NEXT FROM my_curs INTO my_irec;
- EXIT WHEN NOT FOUND;
- my_delta = my_delta + my_irec.delta;
- my_max_serial = my_irec.nevent_serial_id;
- END LOOP;
+ -- Check if we have events that left the applicable range
+ SELECT MAX(nevent_serial_id) AS max_serial_id
+ ,SUM(delta) AS delta_sum
+ INTO my_irec
+ FROM merchant_statistic_counter_event
+ WHERE imeta_serial_id = my_meta
+ AND merchant_serial = my_instance_id
+ AND slot < my_time - my_range
+ AND imeta_serial_id >= my_max_serial;
- IF (0 != my_delta)
+ IF FOUND AND my_irec.delta_sum IS NOT NULL
THEN
+ my_delta = my_irec.delta_sum;
+ my_max_serial = my_irec.max_serial_id;
-- remove expired events from the sum of the current slot
my_rval.rvalue = my_rval.rvalue - my_delta;
UPDATE merchant_statistic_interval_counter
@@ -490,7 +484,7 @@ BEGIN
UPDATE merchant_statistic_interval_counter
SET cumulative_number = cumulative_number + my_delta
WHERE imeta_serial_id = my_meta
- AND merchant_serial = in_merchant_serial
+ AND merchant_serial = my_instance_id
AND range=my_ranges[my_i+1];
IF NOT FOUND
THEN
@@ -505,7 +499,7 @@ BEGIN
,my_instance_id
,my_ranges[my_i+1]
,my_max_serial
- ,in_delta);
+ ,my_delta);
END IF;
ELSE
-- events are obsolete, delete them
@@ -515,10 +509,11 @@ BEGIN
AND slot < my_time - my_range;
END IF;
END IF;
-
- my_rval.range = my_range;
- RETURN NEXT my_rval;
- CLOSE my_curs;
+ IF my_max_serial IS NOT NULL
+ THEN
+ my_rval.range = my_range;
+ RETURN NEXT my_rval;
+ END IF;
END LOOP;
END $$;
@@ -605,6 +600,7 @@ BEGIN
my_rval.rvalue.val = (my_rval.rvalue).val + 1;
END IF;
+ -- Check if we have events that left the applicable range
SELECT MAX(aevent_serial_id) AS max_serial_id
,SUM(delta_value) AS value_sum
,SUM(delta_frac) AS frac_sum
@@ -616,11 +612,11 @@ BEGIN
AND slot < my_time - my_range
AND imeta_serial_id > my_max_serial;
- IF FOUND
+ IF FOUND AND my_jrec.value_sum IS NOT NULL
THEN
- -- Normalize my_delta first
- my_delta_value = my_delta_value + my_delta_frac / 100000000;
- my_delta_frac = my_delta_frac % 100000000;
+ -- Normalize sum first
+ my_delta_value = my_jrec.value_sum + my_jrec.frac_sum / 100000000;
+ my_delta_frac = my_jrec.frac_sum % 100000000;
-- remove expired events from the sum of the current slot
my_rval.rvalue.val = (my_rval.rvalue).val - my_delta_value;
IF ((my_rval.rvalue).frac > my_delta_frac)
@@ -693,10 +689,13 @@ BEGIN
AND instance_id = my_instance_id
AND slot < my_time - my_range;
END IF;
- END IF;
+ END IF;
- my_rval.range = my_range;
- RETURN NEXT my_val;
+ IF my_max_serial IS NOT NULL
+ THEN
+ my_rval.range = my_range;
+ RETURN NEXT my_rval;
+ END IF;
END LOOP; -- over my_ranges
END LOOP; -- over my_currency
END $$;
@@ -936,3 +935,4 @@ END $$;
COMMENT ON PROCEDURE merchant_statistic_bucket_gc
IS 'Performs garbage collection of the merchant_statistic_bucket_counter and merchant_statistic_bucket_amount tables';
+