org.usergrid.persistence.query.ir.result.SubtractionIterator.java Source code

Java tutorial

Introduction

Here is the source code for org.usergrid.persistence.query.ir.result.SubtractionIterator.java

Source

/*******************************************************************************
 * Copyright 2012 Apigee Corporation
 * 
 * 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 org.usergrid.persistence.query.ir.result;

import java.util.LinkedHashSet;
import java.util.Set;
import java.util.UUID;

import org.usergrid.persistence.cassandra.CursorCache;

import com.google.common.collect.Sets;

/**
 * Simple iterator to perform Unions
 * 
 * @author tnine
 * 
 */
public class SubtractionIterator extends MergeIterator {

    private ResultIterator keepIterator;
    private ResultIterator subtractIterator;

    public SubtractionIterator(int pageSize) {
        super(pageSize);
    }

    /**
     * @param subtractIterator
     *          the subtractIterator to set
     */
    public void setSubtractIterator(ResultIterator subtractIterator) {
        this.subtractIterator = subtractIterator;
    }

    /**
     * @param keepIterator
     *          the keepIterator to set
     */
    public void setKeepIterator(ResultIterator keepIterator) {
        this.keepIterator = keepIterator;
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.usergrid.persistence.query.ir.result.ResultIterator#reset()
     */
    @Override
    public void doReset() {
        keepIterator.reset();
        subtractIterator.reset();
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.usergrid.persistence.query.ir.result.MergeIterator#advance()
     */
    @Override
    protected Set<UUID> advance() {
        if (!keepIterator.hasNext()) {
            return null;
        }

        Set<UUID> results = new LinkedHashSet<UUID>(pageSize);

        while (keepIterator.hasNext() && results.size() < pageSize) {

            Set<UUID> keepPage = keepIterator.next();

            while (subtractIterator.hasNext() && keepPage.size() > 0) {
                keepPage = Sets.difference(keepPage, subtractIterator.next());
            }

            subtractIterator.reset();

            results.addAll(keepPage);
        }

        return results;
    }

    /* (non-Javadoc)
     * @see org.usergrid.persistence.query.ir.result.ResultIterator#finalizeCursor(org.usergrid.persistence.cassandra.CursorCache)
     */
    @Override
    public void finalizeCursor(CursorCache cache, UUID lastLoaded) {
        //we can only keep a cursor on our keep result set, we must subtract from every page of keep when loading results
        keepIterator.finalizeCursor(cache, lastLoaded);
    }

}