是否有Quarkus cassandra客户端进行分页的工作示例?

发布于 2025-01-28 18:17:27 字数 698 浏览 3 评论 0 原文

我仍然使用quarkus cassandra客户端 https://quarkus.io/guides/guides/guides/cassandra 我整天都在尝试完成Quarkus集成的分页,但该文档根本没有帮助。 这里的其他人有一个与Quarkus Cassandra客户分页的示例? 请与我分享您的知识。 提前致谢。

编辑:这个我的示例项目/游乐场: https://githbithub.com/Edward-fardward-farkhouri /Quarkus-Cassandra-playground 在这里,您可以找到一个工作示例。

我在此Cassandra文档中找到了一些东西: 并实施了偏置股票,但实际上并不是我正在寻找的...

I am still lost using the Quarkus Cassandra client https://quarkus.io/guides/cassandra
I am trying the whole day to get a pagination done with the quarkus integration but the documentation is not realy helpful at all.
Somebody else here has a working example for pagination with the Quarkus Cassandra client?
Please share your knowledge with me.
Thanks in advance.

EDIT: This my sample project/playground: https://github.com/edward-fakhouri/quarkus-cassandra-playground
Here you can find a working example.

I have found something in this cassandra documentation:
https://docs.datastax.com/en/developer/java-driver/3.1/manual/paging/
and implemented OffsetPagination but it isn't realy what I am searching for...

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

梦里人 2025-02-04 18:17:27

使用最新的Cassandra Bom,您可以

<dependency>
    <groupId>com.datastax.oss.quarkus</groupId>
    <artifactId>cassandra-quarkus-bom</artifactId>
    <version>1.1.2</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>

使用Docker Cassandra开始工作这些测试,此后您的功能开始工作了

    @Override
    public List<Customer> findPagedCustomerByCustomerNumber(String customerNumber, int pageNumber, int pageSize) {
        List<Customer> result = new ArrayList<>();
        PreparedStatement query = cqlSession.prepare(
                "SELECT * FROM test.customer WHERE customer_number = :customerNumber ORDER BY  creation_date");
        BoundStatement completeStatement = query.bind().setString("customerNumber", customerNumber);
        OffsetPager pager = new OffsetPager(pageSize);
        ResultSet resultSet = cqlSession.execute(completeStatement);
        OffsetPager.Page<Row> page = pager.getPage(resultSet, pageNumber);
        List<Row> pageElements = page.getElements();
        pageElements.forEach(c -> result.add(Customer.builder()
                .customerNumber(c.getString("customer_number"))
                .creationDate(c.getLocalDate("creation_date"))
                .description(c.getString("description"))
                .state(c.getString("state"))
                .build())
        );
        return result;
    }

很长一段时间,所以我还补充说,

public List<Customer> findPagedCustomerByCustomerNumberPaging(String customerNumber, int pageNumber, int pageSize) {
        List<Customer> result = new ArrayList<>();
        Select select = QueryBuilder.selectFrom("test", "customer")
                .columns("customer_number", "creation_date", "description", "state")
                .whereColumn("customer_number").isEqualTo(literal(customerNumber))
                .orderBy("createtion_date", ClusteringOrder.ASC)
                .allowFiltering();

        SimpleStatement completeStatement = select.build();
        OffsetPager pager = new OffsetPager(pageSize);
        ResultSet resultSet = cqlSession.execute(completeStatement);
        OffsetPager.Page<Row> page = pager.getPage(resultSet, pageNumber);
        List<Row> pageElements = page.getElements();
        pageElements.forEach(c -> result.add(Customer.builder()
                .customerNumber(c.getString("customer_number"))
                .creationDate(c.getLocalDate("creation_date"))
                .description(c.getString("description"))
                .state(c.getString("state"))
                .build())
        );
        return result;
    }

我也了解到Cassandra-Quarkus-test-frame-framework会带来Docker,但在情况您没有docker,您可以随时使用 cassandraunit 较轻的doight。所有代码均可找到

With the latest cassandra bom you can run those tests

<dependency>
    <groupId>com.datastax.oss.quarkus</groupId>
    <artifactId>cassandra-quarkus-bom</artifactId>
    <version>1.1.2</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>

with that docker cassandra started working, after that your function started working

    @Override
    public List<Customer> findPagedCustomerByCustomerNumber(String customerNumber, int pageNumber, int pageSize) {
        List<Customer> result = new ArrayList<>();
        PreparedStatement query = cqlSession.prepare(
                "SELECT * FROM test.customer WHERE customer_number = :customerNumber ORDER BY  creation_date");
        BoundStatement completeStatement = query.bind().setString("customerNumber", customerNumber);
        OffsetPager pager = new OffsetPager(pageSize);
        ResultSet resultSet = cqlSession.execute(completeStatement);
        OffsetPager.Page<Row> page = pager.getPage(resultSet, pageNumber);
        List<Row> pageElements = page.getElements();
        pageElements.forEach(c -> result.add(Customer.builder()
                .customerNumber(c.getString("customer_number"))
                .creationDate(c.getLocalDate("creation_date"))
                .description(c.getString("description"))
                .state(c.getString("state"))
                .build())
        );
        return result;
    }

I have been using querybuilder for a long time so I added that too

public List<Customer> findPagedCustomerByCustomerNumberPaging(String customerNumber, int pageNumber, int pageSize) {
        List<Customer> result = new ArrayList<>();
        Select select = QueryBuilder.selectFrom("test", "customer")
                .columns("customer_number", "creation_date", "description", "state")
                .whereColumn("customer_number").isEqualTo(literal(customerNumber))
                .orderBy("createtion_date", ClusteringOrder.ASC)
                .allowFiltering();

        SimpleStatement completeStatement = select.build();
        OffsetPager pager = new OffsetPager(pageSize);
        ResultSet resultSet = cqlSession.execute(completeStatement);
        OffsetPager.Page<Row> page = pager.getPage(resultSet, pageNumber);
        List<Row> pageElements = page.getElements();
        pageElements.forEach(c -> result.add(Customer.builder()
                .customerNumber(c.getString("customer_number"))
                .creationDate(c.getLocalDate("creation_date"))
                .description(c.getString("description"))
                .state(c.getString("state"))
                .build())
        );
        return result;
    }

I understand cassandra-quarkus-test-framework brings docker but in case you dont have docker you can always use CassandraUnit which is lighter then docker. All code can be found here.

自由范儿 2025-02-04 18:17:27

Quarkus Cassandra客户端有分页,但是我也无法像我想要的那样使其正常工作。在下面,您可以看到一个示例以获取分页态,其中包含Quarkus文档 https://quarkus.io/guides/guides /cassandra

public PagingFruit getPagingState(String pagingState){
        ByteBuffer state = ByteBuffer.wrap(pagingState.getBytes());
        MutinyMappedReactiveResultSet<Fruit> fruit = this.fruitMapper.fruitDao().findAll(x -> x.setPagingState(state).setPageSize(1000); // here we provide the unary operator that sets the state.  
        var newState = Uni.createFrom().publisher(fruit.getExecutionInfos()).map(ExecutionInfo::getPagingState).await().indefinitely().toString();
        return new PagingFruit(fruit.collect().asList().await().indefinitely(), newState);
}

record PagingFruit(List<Fruit> fruit, String pagingState){}

这使用了mutinyMappedReactiverEsultSet,该群可以使您查询executionInfos。

我目前使用Quarkus实施的问题是,我需要两次查询Cassandra,以实际提供数据和分页。因此,我选择了这样的示例的准备好的陈述:

class PaginatedRepository {

    private final QuarkusCqlSession cqlSession;
    private final PreparedStatement query;
    
    PaginatedRepository(QuarkusCqlSession quarkusCqlSession){
        this.cqlSession = quarkusCqlSession;
        this.query = cqlSession.prepare("SELECT fruit FROM keypace.table");
    }
    
    public Uni<PagingFruit> findFruit(String page) {
        var statement = query
                .bind()
                .setPageSize(1000)
                .setPagingState(PagingState.fromString(page));
    
        return Uni.createFrom().completionStage(cqlSession.executeAsync(statement))
                .map(resultSet -> {
                    var pagingState = resultSet.getExecutionInfo().getSafePagingState();
                    var newCursor = (pagingState == null) ? null : pagingState.toString();
                    var rows = Streams.stream(resultSet.currentPage())
                            .map(row -> row.get(1, Fruit.class)
                            ).filter(Objects::nonNull).toList();
                    return new PagingFruit(rows, newCursor);
                });
    }

这是未经测试的代码,只是应该有效的一般概念。

There is pagination in the Quarkus Cassandra client however I can't make it work as I would like either. Below you see an example to get the pagination state with the example from the quarkus documentation https://quarkus.io/guides/cassandra

public PagingFruit getPagingState(String pagingState){
        ByteBuffer state = ByteBuffer.wrap(pagingState.getBytes());
        MutinyMappedReactiveResultSet<Fruit> fruit = this.fruitMapper.fruitDao().findAll(x -> x.setPagingState(state).setPageSize(1000); // here we provide the unary operator that sets the state.  
        var newState = Uni.createFrom().publisher(fruit.getExecutionInfos()).map(ExecutionInfo::getPagingState).await().indefinitely().toString();
        return new PagingFruit(fruit.collect().asList().await().indefinitely(), newState);
}

record PagingFruit(List<Fruit> fruit, String pagingState){}

This uses the MutinyMappedReactiveResultSet which allows you to query the ExecutionInfos.

The problem I have at this moment using the quarkus implementation is that I need to query Cassandra twice to actually provide the data and the pagination with it. Therefore I opted for a prepared statement like this example:

class PaginatedRepository {

    private final QuarkusCqlSession cqlSession;
    private final PreparedStatement query;
    
    PaginatedRepository(QuarkusCqlSession quarkusCqlSession){
        this.cqlSession = quarkusCqlSession;
        this.query = cqlSession.prepare("SELECT fruit FROM keypace.table");
    }
    
    public Uni<PagingFruit> findFruit(String page) {
        var statement = query
                .bind()
                .setPageSize(1000)
                .setPagingState(PagingState.fromString(page));
    
        return Uni.createFrom().completionStage(cqlSession.executeAsync(statement))
                .map(resultSet -> {
                    var pagingState = resultSet.getExecutionInfo().getSafePagingState();
                    var newCursor = (pagingState == null) ? null : pagingState.toString();
                    var rows = Streams.stream(resultSet.currentPage())
                            .map(row -> row.get(1, Fruit.class)
                            ).filter(Objects::nonNull).toList();
                    return new PagingFruit(rows, newCursor);
                });
    }

This is untested code, just the general concept which should work.

甜柠檬 2025-02-04 18:17:27

因此,在我的反对和我的研究中,与Quarkus cassandra客户在Cassandra数据库上进行分页没有令人信服的方法。您必须自己处理。

So, in my oppinion and my research, there is no convinient way to do pagination on a cassandra database with the quarkus cassandra client. You have to handle it by yourself.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文