X-Git-Url: https://git.openstreetmap.org./rails.git/blobdiff_plain/9018d1af07c53b03bf8caf0480b931dc25f57147..d303b4f6e94e99546d8c7bb8b7302572d1cbd5c6:/db/structure.sql diff --git a/db/structure.sql b/db/structure.sql index a45bb0a70..ba60918f0 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -98,7 +98,8 @@ CREATE TYPE public.nwr_enum AS ENUM ( CREATE TYPE public.user_role_enum AS ENUM ( 'administrator', - 'moderator' + 'moderator', + 'importer' ); @@ -116,59 +117,63 @@ CREATE TYPE public.user_status_enum AS ENUM ( -- --- Name: tile_for_point(integer, integer); Type: FUNCTION; Schema: public; Owner: - +-- Name: api_rate_limit(bigint); Type: FUNCTION; Schema: public; Owner: - -- -CREATE FUNCTION public.tile_for_point(scaled_lat integer, scaled_lon integer) RETURNS bigint - LANGUAGE plpgsql IMMUTABLE +CREATE FUNCTION public.api_rate_limit(user_id bigint) RETURNS integer + LANGUAGE plpgsql STABLE AS $$ -DECLARE - x int8; -- quantized x from lon, - y int8; -- quantized y from lat, -BEGIN - x := round(((scaled_lon / 10000000.0) + 180.0) * 65535.0 / 360.0); - y := round(((scaled_lat / 10000000.0) + 90.0) * 65535.0 / 180.0); - - -- these bit-masks are special numbers used in the bit interleaving algorithm. - -- see https://graphics.stanford.edu/~seander/bithacks.html#InterleaveBMN - -- for the original algorithm and more details. - x := (x | (x << 8)) & 16711935; -- 0x00FF00FF - x := (x | (x << 4)) & 252645135; -- 0x0F0F0F0F - x := (x | (x << 2)) & 858993459; -- 0x33333333 - x := (x | (x << 1)) & 1431655765; -- 0x55555555 - - y := (y | (y << 8)) & 16711935; -- 0x00FF00FF - y := (y | (y << 4)) & 252645135; -- 0x0F0F0F0F - y := (y | (y << 2)) & 858993459; -- 0x33333333 - y := (y | (y << 1)) & 1431655765; -- 0x55555555 - - RETURN (x << 1) | y; -END; -$$; - - --- --- Name: xid_to_int4(xid); Type: FUNCTION; Schema: public; Owner: - --- - -CREATE FUNCTION public.xid_to_int4(t xid) RETURNS integer - LANGUAGE plpgsql IMMUTABLE STRICT - AS $$ -DECLARE - tl bigint; - ti int; -BEGIN - tl := t; - - IF tl >= 2147483648 THEN - tl := tl - 4294967296; - END IF; - - ti := tl; - - RETURN ti; -END; -$$; + DECLARE + min_changes_per_hour int4 := 100; + initial_changes_per_hour int4 := 1000; + max_changes_per_hour int4 := 100000; + days_to_max_changes int4 := 7; + importer_changes_per_hour int4 := 1000000; + moderator_changes_per_hour int4 := 1000000; + roles text[]; + last_block timestamp without time zone; + first_change timestamp without time zone; + active_reports int4; + time_since_first_change double precision; + max_changes double precision; + recent_changes int4; + BEGIN + SELECT ARRAY_AGG(user_roles.role) INTO STRICT roles FROM user_roles WHERE user_roles.user_id = api_rate_limit.user_id; + + IF 'moderator' = ANY(roles) THEN + max_changes := moderator_changes_per_hour; + ELSIF 'importer' = ANY(roles) THEN + max_changes := importer_changes_per_hour; + ELSE + SELECT user_blocks.created_at INTO last_block FROM user_blocks WHERE user_blocks.user_id = api_rate_limit.user_id ORDER BY user_blocks.created_at DESC LIMIT 1; + + IF FOUND THEN + SELECT changesets.created_at INTO first_change FROM changesets WHERE changesets.user_id = api_rate_limit.user_id AND changesets.created_at > last_block ORDER BY changesets.created_at LIMIT 1; + ELSE + SELECT changesets.created_at INTO first_change FROM changesets WHERE changesets.user_id = api_rate_limit.user_id ORDER BY changesets.created_at LIMIT 1; + END IF; + + IF NOT FOUND THEN + first_change := CURRENT_TIMESTAMP AT TIME ZONE 'UTC'; + END IF; + + SELECT COUNT(*) INTO STRICT active_reports + FROM issues INNER JOIN reports ON reports.issue_id = issues.id + WHERE issues.reported_user_id = api_rate_limit.user_id AND issues.status = 'open' AND reports.updated_at >= COALESCE(issues.resolved_at, '1970-01-01'); + + time_since_first_change := EXTRACT(EPOCH FROM CURRENT_TIMESTAMP AT TIME ZONE 'UTC' - first_change); + + max_changes := max_changes_per_hour * POWER(time_since_first_change, 2) / POWER(days_to_max_changes * 24 * 60 * 60, 2); + max_changes := GREATEST(initial_changes_per_hour, LEAST(max_changes_per_hour, FLOOR(max_changes))); + max_changes := max_changes / POWER(2, active_reports); + max_changes := GREATEST(min_changes_per_hour, LEAST(max_changes_per_hour, max_changes)); + END IF; + + SELECT COALESCE(SUM(changesets.num_changes), 0) INTO STRICT recent_changes FROM changesets WHERE changesets.user_id = api_rate_limit.user_id AND changesets.created_at >= CURRENT_TIMESTAMP AT TIME ZONE 'UTC' - '1 hour'::interval; + + RETURN max_changes - recent_changes; + END; + $$; SET default_tablespace = ''; @@ -252,7 +257,7 @@ CREATE TABLE public.active_storage_blobs ( content_type character varying, metadata text, byte_size bigint NOT NULL, - checksum character varying NOT NULL, + checksum character varying, created_at timestamp without time zone NOT NULL, service_name character varying NOT NULL ); @@ -784,7 +789,7 @@ CREATE TABLE public.gps_points ( -- CREATE TABLE public.gpx_file_tags ( - gpx_id bigint DEFAULT 0 NOT NULL, + gpx_id bigint NOT NULL, tag character varying NOT NULL, id bigint NOT NULL ); @@ -1019,7 +1024,6 @@ CREATE TABLE public.note_comments ( -- CREATE SEQUENCE public.note_comments_id_seq - AS integer START WITH 1 INCREMENT BY 1 NO MINVALUE @@ -1055,7 +1059,6 @@ CREATE TABLE public.notes ( -- CREATE SEQUENCE public.notes_id_seq - AS integer START WITH 1 INCREMENT BY 1 NO MINVALUE @@ -1201,7 +1204,6 @@ CREATE TABLE public.oauth_nonces ( -- CREATE SEQUENCE public.oauth_nonces_id_seq - AS integer START WITH 1 INCREMENT BY 1 NO MINVALUE @@ -1216,6 +1218,36 @@ CREATE SEQUENCE public.oauth_nonces_id_seq ALTER SEQUENCE public.oauth_nonces_id_seq OWNED BY public.oauth_nonces.id; +-- +-- Name: oauth_openid_requests; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE public.oauth_openid_requests ( + id bigint NOT NULL, + access_grant_id bigint NOT NULL, + nonce character varying NOT NULL +); + + +-- +-- Name: oauth_openid_requests_id_seq; Type: SEQUENCE; Schema: public; Owner: - +-- + +CREATE SEQUENCE public.oauth_openid_requests_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +-- +-- Name: oauth_openid_requests_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - +-- + +ALTER SEQUENCE public.oauth_openid_requests_id_seq OWNED BY public.oauth_openid_requests.id; + + -- -- Name: oauth_tokens; Type: TABLE; Schema: public; Owner: - -- @@ -1305,7 +1337,7 @@ ALTER SEQUENCE public.redactions_id_seq OWNED BY public.redactions.id; -- CREATE TABLE public.relation_members ( - relation_id bigint DEFAULT 0 NOT NULL, + relation_id bigint NOT NULL, member_type public.nwr_enum NOT NULL, member_id bigint NOT NULL, member_role character varying NOT NULL, @@ -1319,7 +1351,7 @@ CREATE TABLE public.relation_members ( -- CREATE TABLE public.relation_tags ( - relation_id bigint DEFAULT 0 NOT NULL, + relation_id bigint NOT NULL, k character varying DEFAULT ''::character varying NOT NULL, v character varying DEFAULT ''::character varying NOT NULL, version bigint NOT NULL @@ -1331,7 +1363,7 @@ CREATE TABLE public.relation_tags ( -- CREATE TABLE public.relations ( - relation_id bigint DEFAULT 0 NOT NULL, + relation_id bigint NOT NULL, changeset_id bigint NOT NULL, "timestamp" timestamp without time zone NOT NULL, version bigint NOT NULL, @@ -1572,7 +1604,7 @@ CREATE TABLE public.way_nodes ( -- CREATE TABLE public.way_tags ( - way_id bigint DEFAULT 0 NOT NULL, + way_id bigint NOT NULL, k character varying NOT NULL, v character varying NOT NULL, version bigint NOT NULL @@ -1584,7 +1616,7 @@ CREATE TABLE public.way_tags ( -- CREATE TABLE public.ways ( - way_id bigint DEFAULT 0 NOT NULL, + way_id bigint NOT NULL, changeset_id bigint NOT NULL, "timestamp" timestamp without time zone NOT NULL, version bigint NOT NULL, @@ -1768,6 +1800,13 @@ ALTER TABLE ONLY public.oauth_applications ALTER COLUMN id SET DEFAULT nextval(' ALTER TABLE ONLY public.oauth_nonces ALTER COLUMN id SET DEFAULT nextval('public.oauth_nonces_id_seq'::regclass); +-- +-- Name: oauth_openid_requests id; Type: DEFAULT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.oauth_openid_requests ALTER COLUMN id SET DEFAULT nextval('public.oauth_openid_requests_id_seq'::regclass); + + -- -- Name: oauth_tokens id; Type: DEFAULT; Schema: public; Owner: - -- @@ -1865,6 +1904,14 @@ ALTER TABLE ONLY public.changeset_comments ADD CONSTRAINT changeset_comments_pkey PRIMARY KEY (id); +-- +-- Name: changeset_tags changeset_tags_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.changeset_tags + ADD CONSTRAINT changeset_tags_pkey PRIMARY KEY (changeset_id, k); + + -- -- Name: changesets changesets_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- @@ -1902,7 +1949,7 @@ ALTER TABLE ONLY public.current_nodes -- ALTER TABLE ONLY public.current_relation_members - ADD CONSTRAINT current_relation_members_pkey PRIMARY KEY (relation_id, member_type, member_id, member_role, sequence_id); + ADD CONSTRAINT current_relation_members_pkey PRIMARY KEY (relation_id, sequence_id); -- @@ -2097,6 +2144,14 @@ ALTER TABLE ONLY public.oauth_nonces ADD CONSTRAINT oauth_nonces_pkey PRIMARY KEY (id); +-- +-- Name: oauth_openid_requests oauth_openid_requests_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.oauth_openid_requests + ADD CONSTRAINT oauth_openid_requests_pkey PRIMARY KEY (id); + + -- -- Name: oauth_tokens oauth_tokens_pkey; Type: CONSTRAINT; Schema: public; Owner: - -- @@ -2118,7 +2173,7 @@ ALTER TABLE ONLY public.redactions -- ALTER TABLE ONLY public.relation_members - ADD CONSTRAINT relation_members_pkey PRIMARY KEY (relation_id, version, member_type, member_id, member_role, sequence_id); + ADD CONSTRAINT relation_members_pkey PRIMARY KEY (relation_id, version, sequence_id); -- @@ -2224,13 +2279,6 @@ ALTER TABLE ONLY public.ways CREATE INDEX acls_k_idx ON public.acls USING btree (k); --- --- Name: changeset_tags_id_idx; Type: INDEX; Schema: public; Owner: - --- - -CREATE INDEX changeset_tags_id_idx ON public.changeset_tags USING btree (changeset_id); - - -- -- Name: changesets_bbox_idx; Type: INDEX; Schema: public; Owner: - -- @@ -2434,6 +2482,13 @@ CREATE UNIQUE INDEX index_active_storage_blobs_on_key ON public.active_storage_b CREATE UNIQUE INDEX index_active_storage_variant_records_uniqueness ON public.active_storage_variant_records USING btree (blob_id, variation_digest); +-- +-- Name: index_changeset_comments_on_author_id_and_created_at; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX index_changeset_comments_on_author_id_and_created_at ON public.changeset_comments USING btree (author_id, created_at); + + -- -- Name: index_changeset_comments_on_changeset_id_and_created_at; Type: INDEX; Schema: public; Owner: - -- @@ -2448,6 +2503,13 @@ CREATE INDEX index_changeset_comments_on_changeset_id_and_created_at ON public.c CREATE INDEX index_changeset_comments_on_created_at ON public.changeset_comments USING btree (created_at); +-- +-- Name: index_changesets_on_user_id_and_closed_at; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX index_changesets_on_user_id_and_closed_at ON public.changesets USING btree (user_id, closed_at); + + -- -- Name: index_changesets_subscribers_on_changeset_id; Type: INDEX; Schema: public; Owner: - -- @@ -2539,6 +2601,13 @@ CREATE INDEX index_issues_on_status ON public.issues USING btree (status); CREATE INDEX index_issues_on_updated_by ON public.issues USING btree (updated_by); +-- +-- Name: index_note_comments_on_author_id_and_created_at; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX index_note_comments_on_author_id_and_created_at ON public.note_comments USING btree (author_id, created_at); + + -- -- Name: index_note_comments_on_body; Type: INDEX; Schema: public; Owner: - -- @@ -2623,6 +2692,13 @@ CREATE UNIQUE INDEX index_oauth_applications_on_uid ON public.oauth_applications CREATE UNIQUE INDEX index_oauth_nonces_on_nonce_and_timestamp ON public.oauth_nonces USING btree (nonce, "timestamp"); +-- +-- Name: index_oauth_openid_requests_on_access_grant_id; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX index_oauth_openid_requests_on_access_grant_id ON public.oauth_openid_requests USING btree (access_grant_id); + + -- -- Name: index_oauth_tokens_on_token; Type: INDEX; Schema: public; Owner: - -- @@ -3039,6 +3115,14 @@ ALTER TABLE ONLY public.oauth_access_tokens ADD CONSTRAINT fk_rails_732cb83ab7 FOREIGN KEY (application_id) REFERENCES public.oauth_applications(id) NOT VALID; +-- +-- Name: oauth_openid_requests fk_rails_77114b3b09; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.oauth_openid_requests + ADD CONSTRAINT fk_rails_77114b3b09 FOREIGN KEY (access_grant_id) REFERENCES public.oauth_access_grants(id) ON DELETE CASCADE; + + -- -- Name: active_storage_variant_records fk_rails_993965df05; Type: FK CONSTRAINT; Schema: public; Owner: - -- @@ -3382,116 +3466,127 @@ ALTER TABLE ONLY public.ways SET search_path TO "$user", public; INSERT INTO "schema_migrations" (version) VALUES -('1'), -('10'), -('11'), -('12'), -('13'), -('14'), -('15'), -('16'), -('17'), -('18'), -('19'), -('2'), -('20'), -('20100513171259'), -('20100516124737'), -('20100910084426'), -('20101114011429'), -('20110322001319'), -('20110508145337'), -('20110521142405'), -('20110925112722'), -('20111116184519'), -('20111212183945'), -('20120123184321'), -('20120208122334'), -('20120208194454'), -('20120214210114'), -('20120219161649'), -('20120318201948'), -('20120328090602'), -('20120404205604'), -('20120808231205'), -('20121005195010'), -('20121012044047'), -('20121119165817'), -('20121202155309'), -('20121203124841'), -('20130328184137'), -('20131212124700'), -('20140115192822'), -('20140117185510'), -('20140210003018'), -('20140507110937'), -('20140519141742'), -('20150110152606'), -('20150111192335'), -('20150222101847'), -('20150818224516'), -('20160822153055'), -('20161002153425'), -('20161011010929'), -('20170222134109'), -('20180204153242'), -('20181020114000'), -('20181031113522'), -('20190518115041'), -('20190623093642'), -('20190702193519'), -('20190716173946'), -('20191120140058'), -('20201004105659'), -('20201006213836'), -('20201006220807'), -('20201214144017'), -('20210510083027'), -('20210510083028'), -('20210511104518'), -('21'), -('22'), -('23'), -('24'), -('25'), -('26'), -('27'), -('28'), -('29'), -('3'), -('30'), -('31'), -('32'), -('33'), -('34'), -('35'), -('36'), -('37'), -('38'), -('39'), -('4'), -('40'), -('41'), -('42'), -('43'), -('44'), -('45'), -('46'), -('47'), -('48'), -('49'), -('5'), -('50'), -('51'), -('52'), -('53'), -('54'), -('55'), -('56'), -('57'), -('6'), -('7'), +('9'), ('8'), -('9'); - - +('7'), +('6'), +('57'), +('56'), +('55'), +('54'), +('53'), +('52'), +('51'), +('50'), +('5'), +('49'), +('48'), +('47'), +('46'), +('45'), +('44'), +('43'), +('42'), +('41'), +('40'), +('4'), +('39'), +('38'), +('37'), +('36'), +('35'), +('34'), +('33'), +('32'), +('31'), +('30'), +('3'), +('29'), +('28'), +('27'), +('26'), +('25'), +('24'), +('23'), +('22'), +('21'), +('20231206141457'), +('20231117170422'), +('20231101222146'), +('20231029151516'), +('20231010194809'), +('20231007141103'), +('20230830115220'), +('20230830115219'), +('20230825162137'), +('20230816135800'), +('20220223140543'), +('20220201183346'), +('20211216185316'), +('20210511104518'), +('20210510083028'), +('20210510083027'), +('20201214144017'), +('20201006220807'), +('20201006213836'), +('20201004105659'), +('20191120140058'), +('20190716173946'), +('20190702193519'), +('20190623093642'), +('20190518115041'), +('20181031113522'), +('20181020114000'), +('20180204153242'), +('20170222134109'), +('20161011010929'), +('20161002153425'), +('20160822153055'), +('20150818224516'), +('20150222101847'), +('20150111192335'), +('20150110152606'), +('20140519141742'), +('20140507110937'), +('20140210003018'), +('20140117185510'), +('20140115192822'), +('20131212124700'), +('20130328184137'), +('20121203124841'), +('20121202155309'), +('20121119165817'), +('20121012044047'), +('20121005195010'), +('20120808231205'), +('20120404205604'), +('20120328090602'), +('20120318201948'), +('20120219161649'), +('20120214210114'), +('20120208194454'), +('20120208122334'), +('20120123184321'), +('20111212183945'), +('20111116184519'), +('20110925112722'), +('20110521142405'), +('20110508145337'), +('20110322001319'), +('20101114011429'), +('20100910084426'), +('20100516124737'), +('20100513171259'), +('20'), +('2'), +('19'), +('18'), +('17'), +('16'), +('15'), +('14'), +('13'), +('12'), +('11'), +('10'), +('1');