Tom RedmanT
Convex Community14mo ago
9 replies
Tom Redman

Not sure why this is throwing a "multiple paginated queries" error

export const getJobsCountWithQueueAndStatus = internalQuery({
  args: {
    queue: v.string(),
    status: v.union(
      v.literal('pending'),
      v.literal('processing'),
      v.literal('completed'),
      v.literal('failed'),
      v.literal('cancelled'),
    ),
  },
  handler: async (ctx, { queue, status }) => {
    let continueCursor = null;
    let isDone = false;
    let page;
    const pageSize = 5;

    let jobsCount = 0;

    while (!isDone) {
      console.log(queue, status);

      ({ continueCursor, isDone, page } = await ctx.db
        .query('jobs')
        .withIndex('by_queue_status', (q) => q.eq('queue', queue).eq('status', status))
        .paginate({
          cursor: continueCursor,
          numItems: pageSize,
        }));
      jobsCount += page.length;
    }

    return jobsCount;
  },
});


Schema:
    jobs: defineTable({
      args: v.any(),
      attempt: v.number(),
      dependencies: v.optional(v.array(v.id('jobs'))),
      error: v.optional(
        v.object({
          attempt: v.number(),
          message: v.string(),
          stack: v.optional(v.string()),
          timestamp: v.number(),
        }),
      ),
      fnArgs: v.any(),
      fnHandle: v.string(),
      fnName: v.string(),
      fnType: v.union(v.literal('action'), v.literal('mutation'), v.literal('query')),
      maxAttempts: v.number(),
      metadata: v.optional(v.any()),
      nextJobId: v.optional(v.id('jobs')),
      priority: v.number(),
      progress: v.optional(
        v.object({
          current: v.number(),
          status: v.string(),
          total: v.number(),
        }),
      ),
      queue: v.string(),
      resourceRequirements: v.optional(
        v.object({
          cpu: v.number(),
          memory: v.number(),
          timeout: v.number(),
        }),
      ),
      result: v.optional(v.any()),
      status: v.union(
        v.literal('pending'),
        v.literal('processing'),
        v.literal('completed'),
        v.literal('failed'),
        v.literal('cancelled'),
      ),
      timing: v.object({
        completedAt: v.optional(v.number()),
        createdAt: v.number(),
        duration: v.optional(v.number()),
        processingTime: v.optional(v.number()),
        queueTime: v.optional(v.number()),
        startedAt: v.optional(v.number()),
      }),
    }).index('by_queue_status', ['queue', 'status']),


Error:
Error: [CONVEX Q(jobs/jobQueue:getJobsCountWithQueueAndStatus)] [Request ID: e735d416db91c2a6] Server Error
Uncaught Error: This query or mutation function ran multiple paginated queries. Convex only supports a single paginated query in each function.
    at async handler (../../convex/jobs/jobQueue.ts:54:18)

  Called by client


Calling once with arguments:
{
  queue: "instagramApi",
  status: "completed",
}
Was this page helpful?