add scylladb config
This commit is contained in:
parent
a047e642f1
commit
e83578a048
5 changed files with 168 additions and 1 deletions
|
@ -52,6 +52,14 @@ db:
|
||||||
# host: localhost
|
# host: localhost
|
||||||
# rejectUnauthorized: false
|
# rejectUnauthorized: false
|
||||||
|
|
||||||
|
# ┌────────────────────────┐
|
||||||
|
#───┘ ScyllaDB configuration └─────────────────────────────────────
|
||||||
|
|
||||||
|
# scylla:
|
||||||
|
# nodes: ['localhost:9042']
|
||||||
|
# keyspace: calckey
|
||||||
|
# replicationFactor: 1
|
||||||
|
|
||||||
# ┌─────────────────────┐
|
# ┌─────────────────────┐
|
||||||
#───┘ Redis configuration └─────────────────────────────────────
|
#───┘ Redis configuration └─────────────────────────────────────
|
||||||
|
|
||||||
|
@ -67,7 +75,7 @@ redis:
|
||||||
#db: 1
|
#db: 1
|
||||||
#user: default
|
#user: default
|
||||||
|
|
||||||
# ┌─────────────────────────────┐
|
# ┌────────────────────────────┐
|
||||||
#───┘ Cache server configuration └─────────────────────────────────────
|
#───┘ Cache server configuration └─────────────────────────────────────
|
||||||
|
|
||||||
# A Redis-compatible server (DragonflyDB, Keydb, Redis) for caching
|
# A Redis-compatible server (DragonflyDB, Keydb, Redis) for caching
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
DROP TABLE IF EXISTS reaction;
|
||||||
|
DROP MATERIALIZED VIEW IF EXISTS note_by_user_id;
|
||||||
|
DROP INDEX IF EXISTS note_by_id;
|
||||||
|
DROP INDEX IF EXISTS note_by_uri;
|
||||||
|
DROP INDEX IF EXISTS note_by_url;
|
||||||
|
DROP TABLE IF EXISTS note;
|
||||||
|
DROP TYPE IF EXISTS emoji;
|
||||||
|
DROP TYPE IF EXISTS note_edit_history;
|
||||||
|
DROP TYPE IF EXISTS drive_file;
|
|
@ -0,0 +1,83 @@
|
||||||
|
CREATE TYPE IF NOT EXISTS drive_file (
|
||||||
|
id ascii,
|
||||||
|
type ascii,
|
||||||
|
created_at timestamp,
|
||||||
|
name text,
|
||||||
|
comment text,
|
||||||
|
blurhash text,
|
||||||
|
url text,
|
||||||
|
thumbnail_url text,
|
||||||
|
is_sensitive boolean,
|
||||||
|
is_link boolean,
|
||||||
|
md5 ascii,
|
||||||
|
size int,
|
||||||
|
width int,
|
||||||
|
height int,
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TYPE IF NOT EXISTS note_edit_history (
|
||||||
|
content text,
|
||||||
|
cw text,
|
||||||
|
files set<frozen<drive_file>>,
|
||||||
|
updated_at timestamp,
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TYPE IF NOT EXISTS emoji (
|
||||||
|
name text,
|
||||||
|
url text,
|
||||||
|
width int,
|
||||||
|
height int,
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS note ( -- Models timeline
|
||||||
|
created_at_date date, -- For partitioning
|
||||||
|
created_at timestamp,
|
||||||
|
id ascii, -- Post
|
||||||
|
visibility ascii,
|
||||||
|
content text,
|
||||||
|
name text,
|
||||||
|
cw text,
|
||||||
|
local_only boolean,
|
||||||
|
renote_count int,
|
||||||
|
replies_count int,
|
||||||
|
uri text,
|
||||||
|
url text,
|
||||||
|
score int,
|
||||||
|
files set<frozen<drive_file>>,
|
||||||
|
visible_users set<ascii>,
|
||||||
|
mentions set<ascii>,
|
||||||
|
emojis set<frozen<emoji>>,
|
||||||
|
tags set<text>,
|
||||||
|
has_poll boolean,
|
||||||
|
thread_id ascii,
|
||||||
|
channel_id ascii, -- Channel
|
||||||
|
channel_name text,
|
||||||
|
user_id ascii, -- User
|
||||||
|
reply_id ascii, -- Reply
|
||||||
|
renote_id ascii, -- Boost
|
||||||
|
note_edit set<frozen<note_edit_history>>, -- Edit History
|
||||||
|
updated_at timestamp,
|
||||||
|
reactions map<text, int>,
|
||||||
|
reaction_emojis map<text, frozen<emoji>>,
|
||||||
|
PRIMARY KEY (created_at_date, created_at)
|
||||||
|
) WITH CLUSTERING ORDER BY (created_at DESC);
|
||||||
|
|
||||||
|
CREATE INDEX IF NOT EXISTS note_by_id ON note (id);
|
||||||
|
CREATE INDEX IF NOT EXISTS note_by_uri ON note (uri);
|
||||||
|
CREATE INDEX IF NOT EXISTS note_by_url ON note (url);
|
||||||
|
|
||||||
|
CREATE MATERIALIZED VIEW IF NOT EXISTS note_by_user_id AS
|
||||||
|
SELECT * FROM note
|
||||||
|
WHERE user_id IS NOT NULL
|
||||||
|
AND created_at IS NOT NULL
|
||||||
|
AND created_at_date IS NOT NULL
|
||||||
|
PRIMARY KEY (user_id, created_at, created_at_date)
|
||||||
|
WITH CLUSTERING ORDER BY (created_at DESC);
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS reaction (
|
||||||
|
note_id ascii,
|
||||||
|
created_at timestamp,
|
||||||
|
user_id ascii,
|
||||||
|
reaction frozen<emoji>,
|
||||||
|
PRIMARY KEY (note_id, created_at, user_id)
|
||||||
|
);
|
|
@ -16,6 +16,11 @@ export type Source = {
|
||||||
disableCache?: boolean;
|
disableCache?: boolean;
|
||||||
extra?: { [x: string]: string };
|
extra?: { [x: string]: string };
|
||||||
};
|
};
|
||||||
|
scylla?: {
|
||||||
|
nodes: string[];
|
||||||
|
keyspace: string;
|
||||||
|
replicationFactor: number;
|
||||||
|
},
|
||||||
redis: {
|
redis: {
|
||||||
host: string;
|
host: string;
|
||||||
port: number;
|
port: number;
|
||||||
|
|
62
packages/backend/src/db/scylla.ts
Normal file
62
packages/backend/src/db/scylla.ts
Normal file
|
@ -0,0 +1,62 @@
|
||||||
|
import config from "@/config/index.js";
|
||||||
|
import { Client } from "cassandra-driver";
|
||||||
|
|
||||||
|
function newClient(): Client | null {
|
||||||
|
if (!config.scylla) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return new Client({
|
||||||
|
contactPoints: config.scylla.nodes,
|
||||||
|
keyspace: config.scylla.keyspace,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export const scyllaClient = newClient();
|
||||||
|
|
||||||
|
export const prepared = {
|
||||||
|
timeline: {
|
||||||
|
insert: `INSERT INTO note (
|
||||||
|
created_at_date,
|
||||||
|
created_at,
|
||||||
|
id,
|
||||||
|
visibility,
|
||||||
|
content,
|
||||||
|
name,
|
||||||
|
cw,
|
||||||
|
local_only,
|
||||||
|
renote_count,
|
||||||
|
replies_count,
|
||||||
|
uri,
|
||||||
|
url,
|
||||||
|
score,
|
||||||
|
files,
|
||||||
|
visible_users,
|
||||||
|
mentions,
|
||||||
|
emojis,
|
||||||
|
tags,
|
||||||
|
has_poll,
|
||||||
|
thread_id,
|
||||||
|
channel_id,
|
||||||
|
channel_name,
|
||||||
|
user_id,
|
||||||
|
user_id,
|
||||||
|
reply_id,
|
||||||
|
renote_id,
|
||||||
|
note_edit,
|
||||||
|
updated_at,
|
||||||
|
reactions,
|
||||||
|
reaction_emojis
|
||||||
|
)
|
||||||
|
VALUES
|
||||||
|
(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
|
||||||
|
select: {
|
||||||
|
byDate: "SELECT * FROM note WHERE created_at_date = ? AND created_at < ?",
|
||||||
|
byId: "SELECT * FROM note WHERE id IN ?",
|
||||||
|
byUri: "SELECT * FROM note WHERE uri = ?",
|
||||||
|
byUrl: "SELECT * FROM note WHERE url = ?",
|
||||||
|
byUserId: "SELECT * FROM note WHERE user_id = ? AND created_at < ?",
|
||||||
|
},
|
||||||
|
delete: "DELETE FROM note WHERE id IN ?",
|
||||||
|
},
|
||||||
|
}
|
Loading…
Reference in a new issue