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

com.bigdata.relation.rule.eval.ProgramUtility Maven / Gradle / Ivy

/*

Copyright (C) SYSTAP, LLC DBA Blazegraph 2006-2016.  All rights reserved.

Contact:
     SYSTAP, LLC DBA Blazegraph
     2501 Calvert ST NW #106
     Washington, DC 20008
     [email protected]

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

*/
/*
 * Created on Jun 30, 2008
 */

package com.bigdata.relation.rule.eval;

import java.util.Iterator;

import com.bigdata.relation.rule.IProgram;
import com.bigdata.relation.rule.IStep;

/**
 * Support for determining how and where a program should be executed.
 * 
 * @author Bryan Thompson
 * @version $Id$
 */
public class ProgramUtility {
    
//    final protected static Logger log = Logger.getLogger(ProgramUtility.class);

//    private final IResourceLocator resourceLocator;
//    private final long readTimestamp;

//    public ProgramUtility(IJoinNexus joinNexus) {
//        
//        this(joinNexus.getRelationLocator());//, joinNexus.getReadTimestamp());
//        
//    }

//    /**
//     * 
//     * @param resourceLocator
//     */
    public ProgramUtility() {//IResourceLocator resourceLocator) {
        
//        if (resourceLocator == null)
//            throw new IllegalArgumentException();
//        
//        this.resourceLocator = resourceLocator;
        
    }
    
//    /**
//     * Return the {@link IIndexManager} that is capable of resolving all
//     * relations (and their indices) used in the {@link IStep} -or-
//     * null if some relations or indices are not resolvable from
//     * the current context (in general, either because they do not exist or
//     * because they rely on machine or JVM local resources not accessible from
//     * the current execution context).
//     * 

// * Note: If the returned {@link IIndexManager} is an {@link AbstractJournal}, // * an {@link LocalDataServiceFederation} then various optimizations are // * possible, including running program as an {@link AbstractTask} within the // * {@link LocalDataServiceImpl}, including the case where there is access // * to local resources. // * // * @param step // * The program. // * @param timestamp // * The timestamp is relatively arbitrary. We do not actually use // * the relation objects that are being created other than to // * inquire after the names of their indices. // * // * @return The {@link IBigdataFederation} -or- null if the // * indices are all hosted by local resources // * outside of {@link IBigdataFederation} control, such as a // * {@link Journal} or {@link TemporaryStore}. // * // * @throws IllegalArgumentException // * if program is null // * // * @throws IllegalArgumentException // * if program is empty (not an {@link IRule} and having // * no {@link IProgram#steps()}). // * // * @throws IllegalStateException // * if some of the indices are hosted on local resources and // * {@link IBigdataFederation#isDistributed()} is // * true (this implies that those resources MAY be // * unreachable from at least some of the {@link DataService}s // * in the federation). // * // * @throws IllegalStateException // * if there are relations belonging to different // * {@link IBigdataFederation}s. // */ // public IBigdataFederation getFederation(IIndexManager indexManager, // IStep step, long timestamp) { // // if (step == null) // throw new IllegalArgumentException(); // // if(!step.isRule() && ((IProgram)step).stepCount()==0) // throw new IllegalArgumentException("empty program"); // // /* // * The set of distinct relations. // */ // final Map relations = getRelations(indexManager, step, // timestamp); // // if(relations.isEmpty()) { // // // Note: this is either an empty program or a bug. // throw new IllegalArgumentException(); // // } // // // set of distinct index managers (IBigdataFederation, TemporaryStore, Journal, etc). // final Set indexManagers = new HashSet(); // // IBigdataFederation fed = null; // // final Set localResources = new HashSet(); // // final Set feds = new HashSet(); // // for(IRelation relation : relations.values()) { // // final IIndexManager tmp = relation.getIndexManager(); // // indexManagers.add( tmp ); // // if(tmp instanceof IBigdataFederation) { // // feds.add( (IBigdataFederation)tmp ); // // if(fed == null) { // // fed = (IBigdataFederation)tmp; // // } // // } else { // // localResources.add(tmp); // // } // // } // // assert !indexManagers.isEmpty(); // // if(fed == null) { // // /* // * No federation, so all resources must be local. // */ // // assert ! localResources.isEmpty(); // // // Note: [null] indicates non-federation based operation. // return null; // // } // // if (feds.size() > 2) { // // throw new IllegalStateException( // "Program uses more than one federation: #feds=" // + feds.size()); // // } // // if(!localResources.isEmpty() && fed.isDistributed()) { // // throw new IllegalStateException("Program uses local resources but federation is distributed."); // // } // // return fed; // // } /** * true iff the program contains an embedded closure * operation. false if the program is a rule or is itself a * closure operation. * * @param step * The program. * * @return */ public boolean isClosureProgram(IStep step) { if (step == null) throw new IllegalArgumentException(); if(step.isRule()) return false; final IProgram program = (IProgram)step; if (program.isClosure()) return false; final Iterator itr = program.steps(); while (itr.hasNext()) { if (isClosureProgram2(itr.next())) return true; } return false; } /** * true iff this program is or contains a closure operation. */ private boolean isClosureProgram2(IStep step) { if (step == null) throw new IllegalArgumentException(); if (step.isRule()) return false; final IProgram program = (IProgram)step; if (program.isClosure()) return true; final Iterator itr = program.steps(); while (itr.hasNext()) { if (isClosureProgram2(itr.next())) return true; } return false; } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy