Merged in feature/mockserver (pull request #135)
Single Mock Server * mockserver * mockserver * reqs * mockserver * slowrunner * someoptimisedqueries * passedfullsuite * passedfullsuite
This commit is contained in:
@@ -1,12 +1,17 @@
|
||||
CREATE VIEW collectorCurrentActiveVersions as
|
||||
SELECT DISTINCT
|
||||
j.clientId,
|
||||
coalesce(
|
||||
(FIRST_VALUE(v.versionId) OVER (PARTITION BY j.clientId ORDER BY v.id DESC)),
|
||||
0
|
||||
)::int as activeVersion
|
||||
FROM clients as j
|
||||
LEFT JOIN collectorActiveVersions as v on v.clientId = j.clientId;
|
||||
CREATE VIEW collectorCurrentActiveVersions AS
|
||||
SELECT
|
||||
c.clientId,
|
||||
COALESCE(v.versionId, 0)::int AS activeVersion
|
||||
FROM
|
||||
clients c
|
||||
LEFT JOIN (
|
||||
SELECT DISTINCT ON (clientId)
|
||||
clientId,
|
||||
versionId
|
||||
FROM
|
||||
collectorActiveVersions
|
||||
ORDER BY clientId, id DESC
|
||||
) v ON c.clientId = v.clientId;
|
||||
|
||||
CREATE VIEW collectorLatestVersions as
|
||||
SELECT
|
||||
@@ -75,3 +80,44 @@ CREATE VIEW collectorQueryDependencyTree AS
|
||||
FROM collectorQueryDependencyTree as ct
|
||||
JOIN queryCurrentActiveVersions as av on ct.queryId = av.queryId
|
||||
JOIN queries as q on q.queryId = ct.queryId;
|
||||
|
||||
|
||||
CREATE OR REPLACE FUNCTION collectorQueryDependencyTreeByClient(
|
||||
_clientId varchar(255)
|
||||
)
|
||||
RETURNS TABLE (
|
||||
clientId varchar(255),
|
||||
queryId uuid,
|
||||
queryType queryType,
|
||||
queryVersion int,
|
||||
requiredIds uuid[]
|
||||
) AS $$
|
||||
BEGIN
|
||||
RETURN QUERY
|
||||
WITH clientQueries as (
|
||||
SELECT q.clientId, q.queryId
|
||||
FROM currentCollectorQueries as q
|
||||
WHERE q.clientId = _clientId
|
||||
),
|
||||
dependencyTree as (
|
||||
WITH RECURSIVE collectorQueryDependencyTree AS (
|
||||
SELECT cq.clientId, cq.queryId, ri.requiredIds
|
||||
FROM clientQueries as cq
|
||||
JOIN queryCurrentRequiredIdsAGG as ri on cq.queryId = ri.queryId
|
||||
|
||||
UNION ALL
|
||||
|
||||
SELECT acq.clientId, q.queryId, q.requiredIds
|
||||
FROM queryCurrentRequiredIdsAGG as q
|
||||
JOIN collectorQueryDependencyTree as acq on q.queryId = ANY(acq.requiredIds)
|
||||
)
|
||||
SELECT DISTINCT ct.clientId, ct.queryId, q.queryType, av.activeVersion as queryVersion, ct.requiredIds
|
||||
FROM collectorQueryDependencyTree as ct
|
||||
JOIN queryCurrentActiveVersions as av on ct.queryId = av.queryId
|
||||
JOIN queries as q on q.queryId = ct.queryId
|
||||
)
|
||||
SELECT t.clientId, t.queryId, t.queryType, t.queryVersion, t.requiredIds
|
||||
FROM dependencyTree as t
|
||||
WHERE t.clientID is not null;
|
||||
END;
|
||||
$$ LANGUAGE plpgsql;
|
||||
|
||||
@@ -116,8 +116,8 @@ BEGIN
|
||||
),
|
||||
tree as (
|
||||
select q.queryId, q.requiredIds, q.clientId, q.queryVersion
|
||||
from collectorQueryDependencyTree as q
|
||||
join docs as d on q.clientId = d.clientId
|
||||
from docs,
|
||||
LATERAL collectorQueryDependencyTreeByClient(docs.clientId) AS q
|
||||
),
|
||||
query_dependency_tree AS (
|
||||
WITH RECURSIVE query_deps AS (
|
||||
@@ -135,7 +135,6 @@ BEGIN
|
||||
FROM query_deps qd
|
||||
JOIN tree q ON qd.requiredId = q.queryId
|
||||
WHERE array_length(q.requiredIds, 1) > 0
|
||||
|
||||
)
|
||||
SELECT
|
||||
query_deps.queryId,
|
||||
|
||||
@@ -33,7 +33,8 @@ doc_text_entries AS (
|
||||
d.document_id,
|
||||
cte.id AS text_entry_id,
|
||||
d.clean_entry_id,
|
||||
d.clean_fail
|
||||
d.clean_fail,
|
||||
d.client_id
|
||||
FROM
|
||||
doc_clean_entries d
|
||||
LEFT JOIN currentTextEntries cte ON cte.cleanId = d.clean_entry_id
|
||||
@@ -41,16 +42,14 @@ doc_text_entries AS (
|
||||
required_results AS (
|
||||
-- All required document-query-version combinations
|
||||
SELECT
|
||||
d.document_id,
|
||||
dte.document_id,
|
||||
cqdt.queryId,
|
||||
cqdt.queryVersion,
|
||||
dte.text_entry_id
|
||||
FROM
|
||||
doc_clean_entries d
|
||||
JOIN collectorQueryDependencyTree cqdt ON cqdt.clientId = d.client_id
|
||||
JOIN doc_text_entries dte ON dte.document_id = d.document_id
|
||||
and dte.text_entry_id IS NOT NULL
|
||||
where d.clean_fail is null
|
||||
doc_text_entries dte
|
||||
JOIN collectorQueryDependencyTreeByClient($1) cqdt ON cqdt.clientId = dte.client_id
|
||||
where dte.clean_fail is null and dte.text_entry_id IS NOT NULL
|
||||
),
|
||||
existing_results AS (
|
||||
-- Valid results that exist
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
-- name: ListCollectorQueries :many
|
||||
SELECT * FROM collectorQueryDependencyTree WHERE clientId = @clientId;
|
||||
SELECT clientId, queryId, queryType, queryVersion, requiredIds
|
||||
FROM collectorQueryDependencyTreeByClient(@clientId);
|
||||
|
||||
-- name: GetCollectorByClientID :one
|
||||
SELECT * FROM fullActiveCollectors WHERE clientId = @clientId LIMIT 1;
|
||||
|
||||
@@ -75,13 +75,12 @@ SELECT EXISTS (
|
||||
|
||||
-- name: ListQueryDirectDependentsByDocumentID :many
|
||||
WITH doc AS (
|
||||
SELECT id, clientId FROM documents where id = @documentId
|
||||
SELECT clientId FROM documents WHERE id = @documentId
|
||||
)
|
||||
SELECT dt.queryId
|
||||
FROM doc as d
|
||||
JOIN collectorQueryDependencyTree as dt
|
||||
on d.clientId = dt.clientId
|
||||
and @queryId = any(dt.requiredIds);
|
||||
FROM doc,
|
||||
LATERAL collectorQueryDependencyTreeByClient(doc.clientId) AS dt
|
||||
WHERE @queryId = ANY(dt.requiredIds);
|
||||
|
||||
-- name: ListQueryClientIDs :many
|
||||
SELECT clientId FROM collectorQueryDependencyTree WHERE queryId = $1;
|
||||
|
||||
@@ -67,11 +67,19 @@ SELECT r.id, r.value
|
||||
WITH docs as (
|
||||
SELECT id, clientId from documents where id = $1
|
||||
),
|
||||
dependency_tree as (
|
||||
select q.queryId, q.requiredIds, q.clientId, q.queryVersion
|
||||
from docs,
|
||||
LATERAL collectorQueryDependencyTreeByClient(docs.clientId) AS q
|
||||
),
|
||||
text_entries as (
|
||||
select id, documentId from currentTextEntries where documentId = $1
|
||||
),
|
||||
unsyncedQueries AS (
|
||||
SELECT DISTINCT dt.queryId, dt.requiredIds
|
||||
from docs as d
|
||||
JOIN collectorQueryDependencyTree as dt on d.clientId = dt.clientId
|
||||
JOIN currentTextEntries as cte on cte.documentId = d.id
|
||||
JOIN dependency_tree as dt on d.clientId = dt.clientId
|
||||
JOIN text_entries as cte on cte.documentId = d.id
|
||||
LEFT JOIN results as r
|
||||
on r.queryId = dt.queryId
|
||||
and r.queryVersion = dt.queryVersion
|
||||
|
||||
@@ -80,7 +80,8 @@ doc_text_entries AS (
|
||||
d.document_id,
|
||||
cte.id AS text_entry_id,
|
||||
d.clean_entry_id,
|
||||
d.clean_fail
|
||||
d.clean_fail,
|
||||
d.client_id
|
||||
FROM
|
||||
doc_clean_entries d
|
||||
LEFT JOIN currentTextEntries cte ON cte.cleanId = d.clean_entry_id
|
||||
@@ -88,16 +89,14 @@ doc_text_entries AS (
|
||||
required_results AS (
|
||||
-- All required document-query-version combinations
|
||||
SELECT
|
||||
d.document_id,
|
||||
dte.document_id,
|
||||
cqdt.queryId,
|
||||
cqdt.queryVersion,
|
||||
dte.text_entry_id
|
||||
FROM
|
||||
doc_clean_entries d
|
||||
JOIN collectorQueryDependencyTree cqdt ON cqdt.clientId = d.client_id
|
||||
JOIN doc_text_entries dte ON dte.document_id = d.document_id
|
||||
and dte.text_entry_id IS NOT NULL
|
||||
where d.clean_fail is null
|
||||
doc_text_entries dte
|
||||
JOIN collectorQueryDependencyTreeByClient($1) cqdt ON cqdt.clientId = dte.client_id
|
||||
where dte.clean_fail is null and dte.text_entry_id IS NOT NULL
|
||||
),
|
||||
existing_results AS (
|
||||
-- Valid results that exist
|
||||
@@ -178,7 +177,8 @@ SELECT (
|
||||
// d.document_id,
|
||||
// cte.id AS text_entry_id,
|
||||
// d.clean_entry_id,
|
||||
// d.clean_fail
|
||||
// d.clean_fail,
|
||||
// d.client_id
|
||||
// FROM
|
||||
// doc_clean_entries d
|
||||
// LEFT JOIN currentTextEntries cte ON cte.cleanId = d.clean_entry_id
|
||||
@@ -186,16 +186,14 @@ SELECT (
|
||||
// required_results AS (
|
||||
// -- All required document-query-version combinations
|
||||
// SELECT
|
||||
// d.document_id,
|
||||
// dte.document_id,
|
||||
// cqdt.queryId,
|
||||
// cqdt.queryVersion,
|
||||
// dte.text_entry_id
|
||||
// FROM
|
||||
// doc_clean_entries d
|
||||
// JOIN collectorQueryDependencyTree cqdt ON cqdt.clientId = d.client_id
|
||||
// JOIN doc_text_entries dte ON dte.document_id = d.document_id
|
||||
// and dte.text_entry_id IS NOT NULL
|
||||
// where d.clean_fail is null
|
||||
// doc_text_entries dte
|
||||
// JOIN collectorQueryDependencyTreeByClient($1) cqdt ON cqdt.clientId = dte.client_id
|
||||
// where dte.clean_fail is null and dte.text_entry_id IS NOT NULL
|
||||
// ),
|
||||
// existing_results AS (
|
||||
// -- Valid results that exist
|
||||
|
||||
@@ -71,21 +71,31 @@ func (q *Queries) GetCollectorByClientID(ctx context.Context, clientid string) (
|
||||
}
|
||||
|
||||
const listCollectorQueries = `-- name: ListCollectorQueries :many
|
||||
SELECT clientid, queryid, querytype, queryversion, requiredids FROM collectorQueryDependencyTree WHERE clientId = $1
|
||||
SELECT clientId, queryId, queryType, queryVersion, requiredIds
|
||||
FROM collectorQueryDependencyTreeByClient($1)
|
||||
`
|
||||
|
||||
type ListCollectorQueriesRow struct {
|
||||
Clientid *string `db:"clientid"`
|
||||
Queryid *uuid.UUID `db:"queryid"`
|
||||
Querytype NullQuerytype `db:"querytype"`
|
||||
Queryversion *int32 `db:"queryversion"`
|
||||
Requiredids []uuid.UUID `db:"requiredids"`
|
||||
}
|
||||
|
||||
// ListCollectorQueries
|
||||
//
|
||||
// SELECT clientid, queryid, querytype, queryversion, requiredids FROM collectorQueryDependencyTree WHERE clientId = $1
|
||||
func (q *Queries) ListCollectorQueries(ctx context.Context, clientid string) ([]*Collectorquerydependencytree, error) {
|
||||
// SELECT clientId, queryId, queryType, queryVersion, requiredIds
|
||||
// FROM collectorQueryDependencyTreeByClient($1)
|
||||
func (q *Queries) ListCollectorQueries(ctx context.Context, clientid string) ([]*ListCollectorQueriesRow, error) {
|
||||
rows, err := q.db.Query(ctx, listCollectorQueries, clientid)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer rows.Close()
|
||||
items := []*Collectorquerydependencytree{}
|
||||
items := []*ListCollectorQueriesRow{}
|
||||
for rows.Next() {
|
||||
var i Collectorquerydependencytree
|
||||
var i ListCollectorQueriesRow
|
||||
if err := rows.Scan(
|
||||
&i.Clientid,
|
||||
&i.Queryid,
|
||||
|
||||
@@ -142,20 +142,28 @@ func TestCollector(t *testing.T) {
|
||||
qs, err := queries.ListCollectorQueries(ctx, clientId)
|
||||
require.NoError(t, err)
|
||||
assert.Len(t, qs, 2)
|
||||
assert.ElementsMatch(t, []*repository.Collectorquerydependencytree{
|
||||
jsonV := int32(1)
|
||||
contextV := int32(0)
|
||||
assert.ElementsMatch(t, []*repository.ListCollectorQueriesRow{
|
||||
{
|
||||
Clientid: clientId,
|
||||
Clientid: &clientId,
|
||||
Queryid: &jsonId,
|
||||
Queryversion: 1,
|
||||
Querytype: repository.QuerytypeJsonExtractor,
|
||||
Requiredids: []uuid.UUID{contextId},
|
||||
Queryversion: &jsonV,
|
||||
Querytype: repository.NullQuerytype{
|
||||
Querytype: repository.QuerytypeJsonExtractor,
|
||||
Valid: true,
|
||||
},
|
||||
Requiredids: []uuid.UUID{contextId},
|
||||
},
|
||||
{
|
||||
Clientid: clientId,
|
||||
Clientid: &clientId,
|
||||
Queryid: &contextId,
|
||||
Queryversion: 0,
|
||||
Querytype: repository.QuerytypeContextFull,
|
||||
Requiredids: []uuid.UUID{},
|
||||
Queryversion: &contextV,
|
||||
Querytype: repository.NullQuerytype{
|
||||
Querytype: repository.QuerytypeContextFull,
|
||||
Valid: true,
|
||||
},
|
||||
Requiredids: []uuid.UUID{},
|
||||
},
|
||||
}, qs)
|
||||
|
||||
@@ -212,3 +220,48 @@ func TestCollector(t *testing.T) {
|
||||
Fields: nil,
|
||||
}, coll)
|
||||
}
|
||||
|
||||
func BenchmarkListCollectorQueries(b *testing.B) {
|
||||
ctx := context.Background()
|
||||
|
||||
cfg := &serviceconfig.BaseConfig{}
|
||||
net := test.GetNetwork(b)
|
||||
test.CreateDB(b, cfg, net, &test.CreateDatabaseConfig{})
|
||||
|
||||
queries := cfg.GetDBQueries()
|
||||
|
||||
clientId := "EXAMPLE"
|
||||
err := queries.CreateClient(ctx, &repository.CreateClientParams{
|
||||
Name: "example_client",
|
||||
Clientid: clientId,
|
||||
})
|
||||
require.NoError(b, err)
|
||||
|
||||
b.ResetTimer()
|
||||
|
||||
for b.Loop() {
|
||||
_, _ = queries.ListCollectorQueries(ctx, clientId)
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkGetCollectorByClientID(b *testing.B) {
|
||||
ctx := context.Background()
|
||||
|
||||
cfg := &serviceconfig.BaseConfig{}
|
||||
net := test.GetNetwork(b)
|
||||
test.CreateDB(b, cfg, net, &test.CreateDatabaseConfig{})
|
||||
|
||||
queries := cfg.GetDBQueries()
|
||||
|
||||
clientId := "EXAMPLE"
|
||||
err := queries.CreateClient(ctx, &repository.CreateClientParams{
|
||||
Name: "example_client",
|
||||
Clientid: clientId,
|
||||
})
|
||||
require.NoError(b, err)
|
||||
|
||||
b.ResetTimer()
|
||||
for b.Loop() {
|
||||
_, _ = queries.GetCollectorByClientID(ctx, clientId)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -346,30 +346,28 @@ func (q *Queries) ListQueryClientIDs(ctx context.Context, queryid *uuid.UUID) ([
|
||||
|
||||
const listQueryDirectDependentsByDocumentID = `-- name: ListQueryDirectDependentsByDocumentID :many
|
||||
WITH doc AS (
|
||||
SELECT id, clientId FROM documents where id = $2
|
||||
SELECT clientId FROM documents WHERE id = $2
|
||||
)
|
||||
SELECT dt.queryId
|
||||
FROM doc as d
|
||||
JOIN collectorQueryDependencyTree as dt
|
||||
on d.clientId = dt.clientId
|
||||
and $1 = any(dt.requiredIds)
|
||||
FROM doc,
|
||||
LATERAL collectorQueryDependencyTreeByClient(doc.clientId) AS dt
|
||||
WHERE $1 = ANY(dt.requiredIds)
|
||||
`
|
||||
|
||||
type ListQueryDirectDependentsByDocumentIDParams struct {
|
||||
Queryid uuid.UUID `db:"queryid"`
|
||||
Documentid uuid.UUID `db:"documentid"`
|
||||
Queryid *uuid.UUID `db:"queryid"`
|
||||
Documentid *uuid.UUID `db:"documentid"`
|
||||
}
|
||||
|
||||
// ListQueryDirectDependentsByDocumentID
|
||||
//
|
||||
// WITH doc AS (
|
||||
// SELECT id, clientId FROM documents where id = $2
|
||||
// SELECT clientId FROM documents WHERE id = $2
|
||||
// )
|
||||
// SELECT dt.queryId
|
||||
// FROM doc as d
|
||||
// JOIN collectorQueryDependencyTree as dt
|
||||
// on d.clientId = dt.clientId
|
||||
// and $1 = any(dt.requiredIds)
|
||||
// FROM doc,
|
||||
// LATERAL collectorQueryDependencyTreeByClient(doc.clientId) AS dt
|
||||
// WHERE $1 = ANY(dt.requiredIds)
|
||||
func (q *Queries) ListQueryDirectDependentsByDocumentID(ctx context.Context, arg *ListQueryDirectDependentsByDocumentIDParams) ([]*uuid.UUID, error) {
|
||||
rows, err := q.db.Query(ctx, listQueryDirectDependentsByDocumentID, arg.Queryid, arg.Documentid)
|
||||
if err != nil {
|
||||
|
||||
@@ -266,8 +266,8 @@ func TestQueryDependencyTree(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
|
||||
dependents, err := queries.ListQueryDirectDependentsByDocumentID(ctx, &repository.ListQueryDirectDependentsByDocumentIDParams{
|
||||
Documentid: docID,
|
||||
Queryid: contextQueryID,
|
||||
Documentid: &docID,
|
||||
Queryid: &contextQueryID,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
assert.ElementsMatch(t, []uuid.UUID{}, dependents)
|
||||
@@ -283,8 +283,8 @@ func TestQueryDependencyTree(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
|
||||
dependents, err = queries.ListQueryDirectDependentsByDocumentID(ctx, &repository.ListQueryDirectDependentsByDocumentIDParams{
|
||||
Documentid: docID,
|
||||
Queryid: jsonQueryID,
|
||||
Documentid: &docID,
|
||||
Queryid: &jsonQueryID,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
assert.ElementsMatch(t, []uuid.UUID{}, dependents)
|
||||
@@ -297,14 +297,14 @@ func TestQueryDependencyTree(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
|
||||
dependents, err = queries.ListQueryDirectDependentsByDocumentID(ctx, &repository.ListQueryDirectDependentsByDocumentIDParams{
|
||||
Documentid: docID,
|
||||
Queryid: jsonQueryID,
|
||||
Documentid: &docID,
|
||||
Queryid: &jsonQueryID,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
assert.ElementsMatch(t, []uuid.UUID{}, dependents)
|
||||
dependents, err = queries.ListQueryDirectDependentsByDocumentID(ctx, &repository.ListQueryDirectDependentsByDocumentIDParams{
|
||||
Documentid: docID,
|
||||
Queryid: contextQueryID,
|
||||
Documentid: &docID,
|
||||
Queryid: &contextQueryID,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
assert.ElementsMatch(t, []uuid.UUID{}, dependents)
|
||||
@@ -318,14 +318,14 @@ func TestQueryDependencyTree(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
|
||||
dependents, err = queries.ListQueryDirectDependentsByDocumentID(ctx, &repository.ListQueryDirectDependentsByDocumentIDParams{
|
||||
Documentid: docID,
|
||||
Queryid: jsonQueryID,
|
||||
Documentid: &docID,
|
||||
Queryid: &jsonQueryID,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
assert.ElementsMatch(t, []*uuid.UUID{}, dependents)
|
||||
dependents, err = queries.ListQueryDirectDependentsByDocumentID(ctx, &repository.ListQueryDirectDependentsByDocumentIDParams{
|
||||
Documentid: docID,
|
||||
Queryid: contextQueryID,
|
||||
Documentid: &docID,
|
||||
Queryid: &contextQueryID,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
assert.ElementsMatch(t, []*uuid.UUID{&jsonQueryID}, dependents)
|
||||
@@ -341,14 +341,14 @@ func TestQueryDependencyTree(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
|
||||
dependents, err = queries.ListQueryDirectDependentsByDocumentID(ctx, &repository.ListQueryDirectDependentsByDocumentIDParams{
|
||||
Documentid: docID,
|
||||
Queryid: jsonQueryID,
|
||||
Documentid: &docID,
|
||||
Queryid: &jsonQueryID,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
assert.ElementsMatch(t, []*uuid.UUID{}, dependents)
|
||||
dependents, err = queries.ListQueryDirectDependentsByDocumentID(ctx, &repository.ListQueryDirectDependentsByDocumentIDParams{
|
||||
Documentid: docID,
|
||||
Queryid: contextQueryID,
|
||||
Documentid: &docID,
|
||||
Queryid: &contextQueryID,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
assert.ElementsMatch(t, []*uuid.UUID{&jsonQueryID}, dependents)
|
||||
@@ -361,20 +361,20 @@ func TestQueryDependencyTree(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
|
||||
dependents, err = queries.ListQueryDirectDependentsByDocumentID(ctx, &repository.ListQueryDirectDependentsByDocumentIDParams{
|
||||
Documentid: docID,
|
||||
Queryid: secondJsonQueryID,
|
||||
Documentid: &docID,
|
||||
Queryid: &secondJsonQueryID,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
assert.ElementsMatch(t, []*uuid.UUID{}, dependents)
|
||||
dependents, err = queries.ListQueryDirectDependentsByDocumentID(ctx, &repository.ListQueryDirectDependentsByDocumentIDParams{
|
||||
Documentid: docID,
|
||||
Queryid: jsonQueryID,
|
||||
Documentid: &docID,
|
||||
Queryid: &jsonQueryID,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
assert.ElementsMatch(t, []*uuid.UUID{}, dependents)
|
||||
dependents, err = queries.ListQueryDirectDependentsByDocumentID(ctx, &repository.ListQueryDirectDependentsByDocumentIDParams{
|
||||
Documentid: docID,
|
||||
Queryid: contextQueryID,
|
||||
Documentid: &docID,
|
||||
Queryid: &contextQueryID,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
assert.ElementsMatch(t, []*uuid.UUID{&jsonQueryID}, dependents)
|
||||
@@ -388,20 +388,20 @@ func TestQueryDependencyTree(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
|
||||
dependents, err = queries.ListQueryDirectDependentsByDocumentID(ctx, &repository.ListQueryDirectDependentsByDocumentIDParams{
|
||||
Documentid: docID,
|
||||
Queryid: secondJsonQueryID,
|
||||
Documentid: &docID,
|
||||
Queryid: &secondJsonQueryID,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
assert.ElementsMatch(t, []*uuid.UUID{}, dependents)
|
||||
dependents, err = queries.ListQueryDirectDependentsByDocumentID(ctx, &repository.ListQueryDirectDependentsByDocumentIDParams{
|
||||
Documentid: docID,
|
||||
Queryid: jsonQueryID,
|
||||
Documentid: &docID,
|
||||
Queryid: &jsonQueryID,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
assert.ElementsMatch(t, []*uuid.UUID{&secondJsonQueryID}, dependents)
|
||||
dependents, err = queries.ListQueryDirectDependentsByDocumentID(ctx, &repository.ListQueryDirectDependentsByDocumentIDParams{
|
||||
Documentid: docID,
|
||||
Queryid: contextQueryID,
|
||||
Documentid: &docID,
|
||||
Queryid: &contextQueryID,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
assert.ElementsMatch(t, []*uuid.UUID{&jsonQueryID}, dependents)
|
||||
@@ -590,3 +590,37 @@ func TestListQueryClients(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
assert.ElementsMatch(t, []string{clientOneID}, clients)
|
||||
}
|
||||
|
||||
func BenchmarkListQueryDirectDependentsByDocId(b *testing.B) {
|
||||
ctx := context.Background()
|
||||
|
||||
cfg := &serviceconfig.BaseConfig{}
|
||||
net := test.GetNetwork(b)
|
||||
test.CreateDB(b, cfg, net, &test.CreateDatabaseConfig{})
|
||||
|
||||
queries := cfg.GetDBQueries()
|
||||
|
||||
clientID := "EXAMPLE"
|
||||
err := queries.CreateClient(ctx, &repository.CreateClientParams{
|
||||
Name: "example_client",
|
||||
Clientid: clientID,
|
||||
})
|
||||
require.NoError(b, err)
|
||||
|
||||
docID, err := queries.CreateDocument(ctx, &repository.CreateDocumentParams{
|
||||
Clientid: clientID,
|
||||
Hash: "sample",
|
||||
})
|
||||
require.NoError(b, err)
|
||||
|
||||
contextQueryID, err := queries.CreateQuery(ctx, repository.Querytype(repository.QuerytypeContextFull))
|
||||
require.NoError(b, err)
|
||||
|
||||
b.ResetTimer()
|
||||
for b.Loop() {
|
||||
_, _ = queries.ListQueryDirectDependentsByDocumentID(ctx, &repository.ListQueryDirectDependentsByDocumentIDParams{
|
||||
Documentid: &docID,
|
||||
Queryid: &contextQueryID,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -234,11 +234,19 @@ const listUnsyncedNoDepsQueriesByDocId = `-- name: ListUnsyncedNoDepsQueriesByDo
|
||||
WITH docs as (
|
||||
SELECT id, clientId from documents where id = $1
|
||||
),
|
||||
dependency_tree as (
|
||||
select q.queryId, q.requiredIds, q.clientId, q.queryVersion
|
||||
from docs,
|
||||
LATERAL collectorQueryDependencyTreeByClient(docs.clientId) AS q
|
||||
),
|
||||
text_entries as (
|
||||
select id, documentId from currentTextEntries where documentId = $1
|
||||
),
|
||||
unsyncedQueries AS (
|
||||
SELECT DISTINCT dt.queryId, dt.requiredIds
|
||||
from docs as d
|
||||
JOIN collectorQueryDependencyTree as dt on d.clientId = dt.clientId
|
||||
JOIN currentTextEntries as cte on cte.documentId = d.id
|
||||
JOIN dependency_tree as dt on d.clientId = dt.clientId
|
||||
JOIN text_entries as cte on cte.documentId = d.id
|
||||
LEFT JOIN results as r
|
||||
on r.queryId = dt.queryId
|
||||
and r.queryVersion = dt.queryVersion
|
||||
@@ -256,11 +264,19 @@ SELECT DISTINCT queryId FROM unsyncedQueries as baseuq
|
||||
// WITH docs as (
|
||||
// SELECT id, clientId from documents where id = $1
|
||||
// ),
|
||||
// dependency_tree as (
|
||||
// select q.queryId, q.requiredIds, q.clientId, q.queryVersion
|
||||
// from docs,
|
||||
// LATERAL collectorQueryDependencyTreeByClient(docs.clientId) AS q
|
||||
// ),
|
||||
// text_entries as (
|
||||
// select id, documentId from currentTextEntries where documentId = $1
|
||||
// ),
|
||||
// unsyncedQueries AS (
|
||||
// SELECT DISTINCT dt.queryId, dt.requiredIds
|
||||
// from docs as d
|
||||
// JOIN collectorQueryDependencyTree as dt on d.clientId = dt.clientId
|
||||
// JOIN currentTextEntries as cte on cte.documentId = d.id
|
||||
// JOIN dependency_tree as dt on d.clientId = dt.clientId
|
||||
// JOIN text_entries as cte on cte.documentId = d.id
|
||||
// LEFT JOIN results as r
|
||||
// on r.queryId = dt.queryId
|
||||
// and r.queryVersion = dt.queryVersion
|
||||
|
||||
@@ -2,7 +2,6 @@ package repository_test
|
||||
|
||||
import (
|
||||
"context"
|
||||
"sync"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
@@ -128,30 +127,19 @@ type docSyncStateParams struct {
|
||||
}
|
||||
|
||||
func getDocumentSyncState(t testing.TB, ctx context.Context, queries *repository.Queries, params docSyncStateParams) {
|
||||
var wg sync.WaitGroup
|
||||
t.Helper()
|
||||
isSynced, err := queries.IsClientSynced(ctx, ¶ms.clientId)
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, params.isSynced, isSynced)
|
||||
|
||||
wg.Add(1)
|
||||
go func() {
|
||||
isSynced, err := queries.IsClientSynced(ctx, ¶ms.clientId)
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, params.isSynced, isSynced)
|
||||
wg.Done()
|
||||
}()
|
||||
|
||||
wg.Add(1)
|
||||
go func() {
|
||||
doc, err := queries.GetDocumentExternal(ctx, params.documentId)
|
||||
require.NoError(t, err)
|
||||
assert.EqualExportedValues(t, &repository.GetDocumentExternalRow{
|
||||
ID: params.documentId,
|
||||
Clientid: params.clientId,
|
||||
Hash: params.hash,
|
||||
Fields: []byte(params.fields),
|
||||
}, doc)
|
||||
wg.Done()
|
||||
}()
|
||||
|
||||
wg.Wait()
|
||||
doc, err := queries.GetDocumentExternal(ctx, params.documentId)
|
||||
require.NoError(t, err)
|
||||
assert.EqualExportedValues(t, &repository.GetDocumentExternalRow{
|
||||
ID: params.documentId,
|
||||
Clientid: params.clientId,
|
||||
Hash: params.hash,
|
||||
Fields: []byte(params.fields),
|
||||
}, doc)
|
||||
}
|
||||
|
||||
func createQuery(t testing.TB, queries *repository.Queries, queryType repository.Querytype) uuid.UUID {
|
||||
|
||||
Reference in New Issue
Block a user