/*
* (c) Copyright 2006 Hewlett-Packard Development Company, LP
* All rights reserved.
* [See end of file]
*/
package com.hp.hpl.squirrelrdf.ldap;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.hp.hpl.jena.graph.Node;
import com.hp.hpl.jena.graph.Triple;
import com.hp.hpl.jena.query.engine.QueryIterator;
import com.hp.hpl.jena.query.engine1.ExecutionContext;
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.squirrelrdf.querymap.QueryMapEngine;
import com.hp.hpl.squirrelrdf.querymap.QueryMapIterator;
/**
*
* Map triple patterns to ldap queries.
*
* @author pldms
*
*/
public class LdapSparqlMap
{
private static final Log log = LogFactory.getLog(LdapSparqlMap.class);
Model config;
List<Triple> theQuery;
/**
* Initialise using a config mapping
* @param config
*/
public LdapSparqlMap(Model config)
{
this.config = config;
theQuery = new ArrayList<Triple>();
}
/**
* Add a triple to the query pattern
* @param triple
*/
public void addTriple(Triple triple)
{
theQuery.add(triple);
}
/**
* Set the query pattern to these triples
* @param triples
*/
public void setTriples(List<Triple> triples)
{
theQuery = triples;
}
/**
* Break down the query by subject.
* For internal use, mostly.
*/
public List<LdapSubQuery> analyse(List<Triple> query)
{
List<LdapSubQuery> analysed = new ArrayList<LdapSubQuery>();
/* Currently just separated by subject */
Map<Node, LdapSubQuery> mapSubj = new HashMap<Node, LdapSubQuery>();
for (Triple triple: query)
{
LdapSubQuery tripList = mapSubj.get(triple.getSubject());
if (tripList == null)
{
tripList = new LdapSubQuery(config);
analysed.add(tripList);
mapSubj.put(triple.getSubject(), tripList);
}
tripList.add(triple);
}
/* TODO Should sort at this point, I think. Elementary planning. */
return analysed;
}
/**
* Execute the query.
*
* Essentially just analyses the query then plumbs the iterators together.
*
* @param results
* @return
*/
public QueryIterator execute(QueryIterator results, ExecutionContext context)
{
List<LdapSubQuery> subqueries = analyse(theQuery);
for (QueryMapEngine subquery: subqueries)
{
results = new QueryMapIterator(subquery, results, context);
}
return results;
}
}
/*
* (c) Copyright 2006 Hewlett-Packard Development Company, LP All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer. 2. Redistributions in
* binary form must reproduce the above copyright notice, this list of
* conditions and the following disclaimer in the documentation and/or other
* materials provided with the distribution. 3. The name of the author may not
* be used to endorse or promote products derived from this software without
* specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
* EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/