blob: 06b4783842dc7572d4dcb8f215fcdac8b58ffc99 [file] [log] [blame]
-- Licensed to the Apache Software Foundation (ASF) under one
-- or more contributor license agreements. See the NOTICE file
-- distributed with this work for additional information
-- regarding copyright ownership. The ASF licenses this file
-- to you under the Apache License, Version 2.0 (the
-- "License"); you may not use this file except in compliance
-- with the License. You may obtain a copy of the License at
--
-- http://www.apache.org/licenses/LICENSE-2.0
--
-- Unless required by applicable law or agreed to in writing,
-- software distributed under the License is distributed on an
-- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-- KIND, either express or implied. See the License for the
-- specific language governing permissions and limitations
-- under the License.
CREATE TABLE client(
client_id INTEGER NOT NULL,
connect_time TIMESTAMP NOT NULL,
disconnect_time TIMESTAMP,
CONSTRAINT client_pk_hash PRIMARY KEY(client_id)
);
CREATE TABLE sendable(
client_id INTEGER NOT NULL,
type_id INTEGER NOT NULL,
CONSTRAINT sendable_pk_hash PRIMARY KEY(client_id, type_id));
CREATE INDEX sendable_idx_client_id_hash ON sendable(client_id);
CREATE TABLE receivable(
client_id INTEGER NOT NULL,
type_id INTEGER NOT NULL,
CONSTRAINT receivable_pk_hash PRIMARY KEY(client_id, type_id));
CREATE INDEX receivable_idx_client_id_hash ON receivable(client_id);
CREATE INDEX receivable_idx_type_id_hash ON receivable(type_id);
CREATE TABLE cancellable_message(
message_id BIGINT NOT NULL,
CONSTRAINT message_pk_hash PRIMARY KEY(message_id));
-- All message data is denormalized into this table, which is partitioned on
-- receiver_id.
CREATE TABLE queued_message(
receiver_id INTEGER NOT NULL,
message_id BIGINT NOT NULL,
sender_id INTEGER NOT NULL,
send_time TIMESTAMP NOT NULL,
-- Instead of using NULL for no expiration time, we use the farthest point
-- in the future that can be represented. This is because VoltDB stores
-- NULL values as the minimum possible signed integer value, causing them
-- to be ordered first in indexes and sorts, which is the opposite of the
-- behavior we desire. This also allows us to simplify predicates that
-- check if a message has expired to be simply 'NOW < expiration_time'
-- without a secondary NULL check.
expiration_time TIMESTAMP NOT NULL,
priority SMALLINT NOT NULL,
type_id INTEGER NOT NULL,
payload VARBINARY(1048576) NOT NULL, -- VoltDB limits VARBINARY to 1MB.
payload_bytes INTEGER NOT NULL,
CONSTRAINT queued_message_pk_hash PRIMARY KEY(receiver_id, message_id));
PARTITION TABLE queued_message ON COLUMN receiver_id;
-- TODO(chasseur): Previously this index also included 'expiration_time',
-- 'send_time', and 'message_id' because a predicate on 'expiration_time' is
-- part of the WHERE clause that selects messages, and all 3 columns are part
-- of the ORDER BY clause which sorts messages. However, even with these
-- columns in the index in correct order, the VoltDB optimizer still produces
-- a plan which includes a filter on 'expiration_time' and a sort to implement
-- ORDER BY. Therefore, the index has been reduced to only the columns which
-- are actually used by the query plan. Investigate further to see whether we
-- can coax VoltDB to use an index on the 5 relevant columns to omit a sort.
CREATE INDEX queue_index ON queued_message(receiver_id, priority DESC);
CREATE INDEX queued_message_idx_message_id_hash ON queued_message(message_id);
CREATE INDEX queued_message_idx_expiration_time
ON queued_message(expiration_time);
CREATE PROCEDURE RegisterReceiverUnchecked AS
INSERT INTO receivable VALUES(?, ?);
CREATE PROCEDURE RegisterSenderUnchecked AS
INSERT INTO sendable VALUES(?, ?);
CREATE PROCEDURE CountQueuedMessagesForClient AS
SELECT COUNT(*) FROM queued_message WHERE receiver_id = ?;
PARTITION PROCEDURE CountQueuedMessagesForClient
ON TABLE queued_message COLUMN receiver_id
PARAMETER 0;
CREATE PROCEDURE FROM CLASS tmb.voltdb.CancelMessages;
CREATE PROCEDURE FROM CLASS tmb.voltdb.ConnectClient;
CREATE PROCEDURE FROM CLASS tmb.voltdb.DeleteMessages;
PARTITION PROCEDURE DeleteMessages
ON TABLE queued_message COLUMN receiver_id
PARAMETER 0;
CREATE PROCEDURE FROM CLASS tmb.voltdb.DeleteMessagesUnchecked;
PARTITION PROCEDURE DeleteMessagesUnchecked
ON TABLE queued_message COLUMN receiver_id
PARAMETER 0;
CREATE PROCEDURE FROM CLASS tmb.voltdb.DisconnectClient;
CREATE PROCEDURE FROM CLASS tmb.voltdb.LoadState;
CREATE PROCEDURE FROM CLASS tmb.voltdb.Receive;
PARTITION PROCEDURE Receive
ON TABLE queued_message COLUMN receiver_id
PARAMETER 0;
CREATE PROCEDURE FROM CLASS tmb.voltdb.ReceiveAndDelete;
PARTITION PROCEDURE ReceiveAndDelete
ON TABLE queued_message COLUMN receiver_id
PARAMETER 0;
CREATE PROCEDURE FROM CLASS tmb.voltdb.RegisterReceiver;
CREATE PROCEDURE FROM CLASS tmb.voltdb.RegisterSender;
CREATE PROCEDURE FROM CLASS tmb.voltdb.ResetBus;
CREATE PROCEDURE FROM CLASS tmb.voltdb.SendToAny;
CREATE PROCEDURE FROM CLASS tmb.voltdb.SendToExplicitReceivers;
CREATE PROCEDURE FROM CLASS tmb.voltdb.SendToExplicitReceiversUnchecked;
CREATE PROCEDURE FROM CLASS tmb.voltdb.SendToSingleExplicitReceiver;
PARTITION PROCEDURE SendToSingleExplicitReceiver
ON TABLE queued_message COLUMN receiver_id
PARAMETER 1;
CREATE PROCEDURE FROM CLASS tmb.voltdb.SendToSingleExplicitReceiverUnchecked;
PARTITION PROCEDURE SendToSingleExplicitReceiverUnchecked
ON TABLE queued_message COLUMN receiver_id
PARAMETER 1;