-
Notifications
You must be signed in to change notification settings - Fork 331
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
GraphQL subscriptions mutation_type
is always UPDATE
#2590
Comments
Also, i'm now playing around with deletions, it can't manage to receive any |
I've had a look into this and without some larger changes this isn't trivial. The main change would be to this function: It would need to be updated to something like: export function createSendNotificationTriggerFunction(schema: string): string {
return `
CREATE OR REPLACE FUNCTION "${schema}".send_notification()
RETURNS trigger AS $$
DECLARE
channel TEXT;
table_name TEXT;
row RECORD;
payload JSONB;
prev_entity BOOLEAN;
next_entity BOOLEAN;
BEGIN
channel:= TG_ARGV[0];
table_name:= TG_TABLE_NAME;
IF (TG_OP = 'DELETE') THEN
row = OLD;
ELSE
row = NEW;
END IF;
payload = jsonb_build_object(
'id', row.id,
'mutation_type', TG_OP,
'_entity', row);
IF payload -> '_entity' ? '_block_range' then
payload = payload #- '{"_entity","_id"}';
payload = payload #- '{"_entity","_block_range"}';
IF NOT upper_inf(row._block_range) then
EXECUTE FORMAT(
'SELECT EXISTS (SELECT 1 FROM "${schema}".%I WHERE id = $1 AND lower(_block_range) = upper($2))',
TG_TABLE_NAME
)
INTO next_entity
USING row.id, row._block_range;
IF NOT next_entity THEN
payload = payload || '{"mutation_type": "DELETE"}';
ELSE
RETURN NULL;
END IF;
ELSE
EXECUTE FORMAT(
'SELECT EXISTS (SELECT 1 FROM "${schema}".%I WHERE id = $1 AND upper(_block_range) = lower($2))',
TG_TABLE_NAME
)
INTO prev_entity
USING row.id, row._block_range;
IF NOT prev_entity THEN
payload = payload || '{"mutation_type": "INSERT"}';
ELSE
payload = payload || '{"mutation_type": "UPDATE"}';
END IF;
END IF;
END IF;
IF (octet_length(payload::text) >= 8000) THEN
payload = payload || '{"_entity": null}';
END IF;
PERFORM pg_notify(
channel::text,
payload::text);
RETURN NULL;
END;
$$ LANGUAGE plpgsql;`;
} But this falls down with historical indexing, because when an entity is updated, it will create a new record + update the previous record. As the trigger that calls this function is called for each operation its not easy to determine whether it should be an insert or update (delete works fine). There will also be a performance impact on this as it needs to make extra select queries I've parked my work here https://github.com/subquery/subql/tree/sub-historical-mutation |
Prerequisites
Description
When subscribing to an entity, the
mutation_type
seems to always beUPDATE
, at least for newly created entityDetails
These details can help to reproduce the environment the issue is occurring
Local Environment: node v20.15.1
Query Version:
@subql/query@^2.15.2
Indexer Version:
@subql/node-ethereum@^5.1.7
Network Details:
Steps to Reproduce
mutation_type
set toUPDATE
Expected behavior:
mutation_type
should beINSERT
Actual behavior:
mutation_type
isUPDATE
The text was updated successfully, but these errors were encountered: