@Override
    public Stream<? extends Ticket> getSessionsWithAttributes(final Map<String, List<Object>> queryAttributes) {
        val ticketDefinitions = ticketCatalog.findTicketDefinition(TicketGrantingTicket.class);
        return ticketDefinitions
            .stream()
            .flatMap(Unchecked.function(definition -> {
                val collection = getTicketCollectionInstanceByMetadata(definition);
                val criteria = queryAttributes.entrySet()
                    .stream()
                    .map(entry -> entry.getValue()
                        .stream()
                        .map(queryValue -> {
                            val key = "attributes." + digestIdentifier(entry.getKey());
                            return Filter.arrayContains(key, digestIdentifier(queryValue.toString()));
                        })
                        .toList())
                    .flatMap(List::stream)
                    .toList();
                val spliterator = firestore.collection(collection)
                    .whereEqualTo("prefix", digestIdentifier(definition.getPrefix()))
                    .where(Filter.or(criteria.toArray(Filter[]::new)))
                    .get()
                    .get()
                    .spliterator();
                return StreamSupport.stream(spliterator, false);
            }))
            .map(document -> document.toObject(GoogleCloudFirestoreTicketDocument.class))
            .map(document -> deserializeTicket(document.getJson(), document.getType()))
            .map(this::decodeTicket)
            .filter(ticket -> !ticket.isExpired());
    }
This is {@link GoogleCloudFirestoreTicketRegistry}.

@author Misagh Moayyed
@since 7.0.0
support/cas-server-support-gcp-firestore-ticket-registry/src/main/java/org/apereo/cas/ticket/registry/GoogleCloudFirestoreTicketRegistry.java