All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.hazelcast.client.impl.protocol.codec.holder.PagingPredicateHolder Maven / Gradle / Ivy

The newest version!
/*
 * Copyright (c) 2008-2024, Hazelcast, Inc. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.hazelcast.client.impl.protocol.codec.holder;

import com.hazelcast.internal.serialization.Data;
import com.hazelcast.internal.serialization.SerializationService;
import com.hazelcast.internal.util.IterationType;
import com.hazelcast.query.PartitionPredicate;
import com.hazelcast.query.Predicate;
import com.hazelcast.query.impl.predicates.MultiPartitionPredicateImpl;
import com.hazelcast.query.impl.predicates.PagingPredicateImpl;
import com.hazelcast.query.impl.predicates.PartitionPredicateImpl;

import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.AbstractMap;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;

public class PagingPredicateHolder {
    private final AnchorDataListHolder anchorDataListHolder;
    private final Data predicateData;
    private final Data comparatorData;
    private final int pageSize;
    private final int page;
    private final byte iterationTypeId;
    private final Collection partitionKeysData;

    public PagingPredicateHolder(AnchorDataListHolder anchorDataListHolder, Data predicateData, Data comparatorData,
                                 int pageSize, int page, byte iterationTypeId,
                                 Data partitionKeyData,
                                 boolean partitionKeysDataExists,
                                 Collection partitionKeysData) {
        this.anchorDataListHolder = anchorDataListHolder;
        this.predicateData = predicateData;
        this.comparatorData = comparatorData;
        this.pageSize = pageSize;
        this.page = page;
        this.iterationTypeId = iterationTypeId;
        this.partitionKeysData = partitionKeysData != null
             ? partitionKeysData.stream().collect(Collectors.toSet())
             : partitionKeyData != null
                   ? Collections.singleton(partitionKeyData)
                   : null;
    }

    public AnchorDataListHolder getAnchorDataListHolder() {
        return anchorDataListHolder;
    }

    public Data getPredicateData() {
        return predicateData;
    }

    public Data getComparatorData() {
        return comparatorData;
    }

    public int getPageSize() {
        return pageSize;
    }

    public int getPage() {
        return page;
    }

    public byte getIterationTypeId() {
        return iterationTypeId;
    }

    public Data getPartitionKeyData() {
        if (partitionKeysData == null) {
            return null;
        }
        // PagingPredicateHolder constructor ensures that partitionKeysData is non-empty
        return partitionKeysData.iterator().next();
    }

    public Collection getPartitionKeysData() {
        return partitionKeysData;
    }

    public  Predicate asPredicate(SerializationService serializationService, @Nullable String namespace) {
        throw new UnsupportedOperationException();
    }

    public static  PagingPredicateHolder of(Predicate predicate,
                                                  SerializationService serializationService) {
        if (predicate instanceof PartitionPredicate) {
            return ofInternal((PartitionPredicate) predicate, serializationService);
        }

        return ofInternal((PagingPredicateImpl) predicate, serializationService);
    }

    private static  PagingPredicateHolder ofInternal(PagingPredicateImpl pagingPredicate,
                                                           SerializationService serializationService) {
        if (pagingPredicate == null) {
            return null;
        }

        return buildHolder(serializationService, pagingPredicate, null);
    }

    private static  PagingPredicateHolder ofInternal(@Nonnull PartitionPredicate partitionPredicate,
                                                           SerializationService serializationService) {
        PagingPredicateImpl pagingPredicate = (PagingPredicateImpl) partitionPredicate.getTarget();
        return buildHolder(serializationService,
                pagingPredicate,
                partitionPredicate.getPartitionKeys());
    }

    private static  PagingPredicateHolder buildHolder(SerializationService serializationService,
                                                            PagingPredicateImpl pagingPredicate,
                                                            Collection partitionKeys) {
        List>> anchorList = pagingPredicate.getAnchorList();
        List> anchorDataList = new ArrayList<>(anchorList.size());
        List pageList = new ArrayList<>(anchorList.size());
        anchorList.forEach(item -> {
            pageList.add(item.getKey());
            Map.Entry anchorEntry = item.getValue();
            anchorDataList.add(new AbstractMap.SimpleImmutableEntry<>(serializationService.toData(anchorEntry.getKey()),
                    serializationService.toData(anchorEntry.getValue())));
        });

        AnchorDataListHolder anchorDataListHolder = new AnchorDataListHolder(pageList, anchorDataList);
        Data predicateData = serializationService.toData(pagingPredicate.getPredicate());
        Data comparatorData = serializationService.toData(pagingPredicate.getComparator());
        boolean partitionKeysDataExists = partitionKeys != null;
        return new PagingPredicateHolder(anchorDataListHolder, predicateData, comparatorData, pagingPredicate.getPageSize(),
                pagingPredicate.getPage(), pagingPredicate.getIterationType().getId(), null,
                partitionKeysDataExists,
                partitionKeysDataExists
                    ? partitionKeys.stream().map(k -> (Data) serializationService.toData(k)).collect(Collectors.toList())
                    : null
        );
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }
        PagingPredicateHolder that = (PagingPredicateHolder) o;
        return pageSize == that.pageSize && page == that.page && iterationTypeId == that.iterationTypeId && Objects
                .equals(anchorDataListHolder, that.anchorDataListHolder) && predicateData.equals(that.predicateData)
                && comparatorData.equals(that.comparatorData) && partitionKeysData.equals(that.partitionKeysData);
    }

    @Override
    public int hashCode() {
        return Objects
                .hash(anchorDataListHolder, predicateData, comparatorData, pageSize, page, iterationTypeId, partitionKeysData);
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy