Skip to content

Instantly share code, notes, and snippets.

@danecando
Last active July 18, 2022 01:04
Show Gist options
  • Save danecando/5d78cd28b54e6d81460325e703f21453 to your computer and use it in GitHub Desktop.
Save danecando/5d78cd28b54e6d81460325e703f21453 to your computer and use it in GitHub Desktop.
Meetings layout EdgeDB query experiment
type QueryResult = {
nextMeeting?: Meeting;
scheduledMeetings: {
items: Meeting[];
count: number;
hasMore: boolean;
};
attendedMeetings: {
items: MeetingFields[];
count: number;
hasMore: boolean;
};
groups: Group[];
};
const query = async (userId: string) => {
const result = await edb.queryRequiredSingle<QueryResult>(
`
with
groupLimit := <int64>10,
meetingLimit := <int64>50,
scheduledMeetings := (
select Meeting
filter (
.admin.id ?= <uuid>$userId
or .chairperson.id ?= <uuid>$userId
or .speaker.id ?= <uuid>$userId
) and .startingTime >= datetime_of_statement()
order by .startingTime asc
limit meetingLimit + 1
),
attendedMeetings := (
select Meeting
filter
.attendees.id ?= <uuid>$userId
and .startingTime < datetime_of_statement()
order by .startingTime asc
limit meetingLimit + 1
),
select {
nextMeeting := (select scheduledMeetings { ${SELECT_MEETING} } limit 1),
scheduledMeetings := (
with
page := (select scheduledMeetings limit meetingLimit),
select {
items := (select page { ${SELECT_MEETING} }),
count := count(page),
hasMore := count(scheduledMeetings) > meetingLimit,
}
),
attendedMeetings := (
with
page := (select attendedMeetings limit meetingLimit),
select {
items := (select page { ${MEETING_FIELDS} }),
count := count(page),
hasMore := count(attendedMeetings) > meetingLimit,
}
),
groups := (
select \`Group\` {
${SELECT_GROUP}
}
filter .admin.id ?= <uuid>$userId
limit groupLimit
),
}
`,
{
userId,
}
);
return result;
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment