From 2315671dad089a468c20e197ce87741daa2be282 Mon Sep 17 00:00:00 2001
From: alangrafu <alvaro@graves.cl>
Date: Sat, 17 Sep 2011 01:54:02 -0700
Subject: [PATCH] Adding feature: Each query can be executed against a
 different sparql endpoint

Model definition:

The new structure will be

models\
           |
           |
           \foaf:Person.model.html\
                                              |
                                              |
                                              \localQuery1
                                              \localQuery2
                                              \dbpedia\
                                                           |
                                                           |

\queryInDBpedia1

\queryInDBpedia1

Queries under the type subdir will be executed against the default
sparql endpoint
Quries under a subdir named an endpoint shortcut(*) will be ran against
that endpoint

(*) You need to define an endpoint in settings.inc.php

to query against your endpoint you need to define
$conf['endpoint']['mySparqlEndpoint'] = 'http://example.org/sparql';

Sparql endpoints are already defined for dbpedia and logd

Later you can create a subdirectory called 'mySparqlEndpoint' under a
model.

By aware that it is HIGHLY recommended to use only letters and numbers
(no periods, colons, etc.)
---
 classes/Utils.php                            | 144 ++++++++++++-------
 common.inc.php                               |   3 +
 index.php                                    |  24 ++--
 models/local:AsDAsd.model.html/dbpedia/alla2 |   3 +
 4 files changed, 103 insertions(+), 71 deletions(-)
 create mode 100644 models/local:AsDAsd.model.html/dbpedia/alla2

diff --git a/classes/Utils.php b/classes/Utils.php
index 10fe0fdc..2c249b32 100644
--- a/classes/Utils.php
+++ b/classes/Utils.php
@@ -73,23 +73,29 @@ class Utils{
   private static function sparqlResult2Obj($data){
   	$aux = $data['results']['bindings'];
   	$obj = array();
-  	if(sizeof($aux)>0){
-  	  foreach($aux as $w){
-  	  	$row = array();
-  	  	foreach($w as $k => $v){
-  	  	  $row['value'][$k] = $v['value'];
-  	  	  if($v['type'] == 'uri'){
-  	  	  	$row['curie'][$k] = Utils::uri2curie($v['value']);
-  	  	  	$row['uri'][$k] = 1;
-  	  	  }elseif($v['type'] == 'bnode'){
-  	  	  	$row['curie'][$k] = 'blankNode';
+  	if(!isset($aux)){
+  	  foreach($data as $k => $v){
+  	  	$obj[$k] = Utils::sparqlResult2Obj($v);
+  	  }
+  	}else{
+  	  if(sizeof($aux)>0){
+  	  	foreach($aux as $w){
+  	  	  $row = array();
+  	  	  foreach($w as $k => $v){
+  	  	  	$row['value'][$k] = $v['value'];
+  	  	  	if($v['type'] == 'uri'){
+  	  	  	  $row['curie'][$k] = Utils::uri2curie($v['value']);
+  	  	  	  $row['uri'][$k] = 1;
+  	  	  	}elseif($v['type'] == 'bnode'){
+  	  	  	  $row['curie'][$k] = 'blankNode';
+  	  	  	}
+  	  	  }
+  	  	  if(sizeof($row) >0){
+  	  	  	array_push($obj, $row);
+  	  	  }
+  	  	  if(sizeof($aux) == 1){
+  	  	  	$obj = $row;
   	  	  }
-  	  	}
-  	  	if(sizeof($row) >0){
-  	  	  array_push($obj, $row);
-  	  	}
-  	  	if(sizeof($aux) == 1){
-  	  	  return $row;
   	  	}
   	  }
   	}
@@ -112,14 +118,8 @@ class Utils{
   	  ));
   	
   	$r = array();
-  	if(!isset($data['results'])){
-  	  foreach($data as $k => $v){
-  	  	$r[$k] = Utils::sparqlResult2Obj($v);
-  	  }
-  	}else{
   	  $r = Utils::sparqlResult2Obj($data);  	
-	}
-  	$vars = compact('base', 'r');
+ 	$vars = compact('base', 'r');
 	if(is_file($view)){
 	  Haanga::Load($view, $vars);
 	}else{
@@ -166,32 +166,38 @@ class Utils{
   
   private static function serializeByQueryType($data, $extension){
   	global	$conf;
-  	if(preg_match("/describe/i", $data['query'])){  	  
-  	  require('lib/arc2/ARC2.php');
-  	  $parser = ARC2::getRDFParser();
-  	  $parser->parse($conf['basedir'], $data['results']);
-  	  $triples = $parser->getTriples();
-  	  $ser;
-  	  switch ($extension){
-  	  case 'ttl':
-  	  	$ser = ARC2::getTurtleSerializer();
-  	  	break;
-  	  case 'nt':
-  	  	$ser = ARC2::getNTriplesSerializer();
-  	  	break;
-  	  case 'rdf':
-  	  	$ser = ARC2::getRDFXMLSerializer();
-  	  	break;
+  	if(!isset($data['results'])){
+  	  foreach($data as $k => $v){
+  	  	$results[$k] = Utils::serializeByQueryType($v, $extension); 	  	
+ 	  }
+  	}else{
+  	  if(preg_match("/describe/i", $data['query'])){  	  
+  	  	require('lib/arc2/ARC2.php');
+  	  	$parser = ARC2::getRDFParser();
+  	  	$parser->parse($conf['basedir'], $data['results']);
+  	  	$triples = $parser->getTriples();
+  	  	$ser;
+  	  	switch ($extension){
+  	  	case 'ttl':
+  	  	  $ser = ARC2::getTurtleSerializer();
+  	  	  break;
+  	  	case 'nt':
+  	  	  $ser = ARC2::getNTriplesSerializer();
+  	  	  break;
+  	  	case 'rdf':
+  	  	  $ser = ARC2::getRDFXMLSerializer();
+  	  	  break;
+  	  	}
+  	  	$doc = $ser->getSerializedTriples($triples);
+  	  	echo $doc;
+  	  	exit(0);
   	  }
-  	  $doc = $ser->getSerializedTriples($triples);
-  	  echo $doc;
-  	  exit(0);
-  	}
-  	elseif(preg_match("/select/i", $data['query'])){
-  	  $results = $data['results'];
-  	  if(sizeof($results['results']['bindings']) == 0){
-  	  	//Avoid for now
-  	  	//Utils::send404($uri);
+  	  elseif(preg_match("/select/i", $data['query'])){
+  	  	$results = $data['results'];
+  	  	if(sizeof($results['results']['bindings']) == 0){
+  	  	  //Avoid for now
+  	  	  //Utils::send404($uri);
+  	  	}
   	  }
   	}
   	return $results;
@@ -202,13 +208,8 @@ class Utils{
   	$extension = Utils::getExtension($contentType); 
   	
   	header('Content-Type: '.$contentType);
-  	if(!isset($data['results'])){
-  	  foreach($data as $k => $v){
-  	  	$results[$k] = Utils::serializeByQueryType($v, $extension);
-  	  }
-  	}else{
-  	  $results = Utils::serializeByQueryType($data, $extension);
-  	}	
+  	$results = Utils::serializeByQueryType($data, $extension);
+  	
   	$baseData['uri'] = $uri;
   	$baseData['params'] = $data['params'];
   	Utils::showView($baseData, $results, $viewFile);  	
@@ -228,5 +229,38 @@ class Utils{
   	} 
   }
   
+  public static function queryDir($modelDir, $e){
+  	global $conf;
+  	global $uri;
+  	$originalDir = getcwd();
+  	chdir($modelDir);
+  	$handle = opendir('.');
+  	$data = array();
+  	while (false !== ($modelFile = readdir($handle))) {
+  	  if($modelFile != "." && $modelFile != ".."){
+  	  	if(is_dir($modelFile)){
+  	  	  $data[$modelFile] = Utils::queryDir($modelFile, $e);
+  	  	}else{
+  	  	  $query = file_get_contents($modelFile);
+  	  	  $query = preg_replace("|".$conf['resource']['url_delimiter']."|", "<".$uri.">", $query);
+ 	  	  if(isset($conf['endpoint'][$modelDir])){
+  	  	  	//Use or create new endpoint
+  	  	  	
+  	  	  	if(!isset($e[$modelDir])){
+  	  	  	  $e[$modelDir] = new Endpoint($conf['endpoint'][$modelDir], $conf['endpoint']['config']);
+  	  	  	}
+  	  	  	$data[$modelFile]['results'] = $e[$modelDir]->query($query, Utils::getResultsType($query));
+ 	  	  }else{
+  	  	  	//User default endpoint
+  	  	  	$data[$modelFile]['results'] = $e['base']->query($query, Utils::getResultsType($query));  
+  	  	  }
+  	  	  $data[$modelFile]['query'] = $query;
+  	  	}
+  	  }
+  	}
+  	chdir($originalDir);
+  	return $data;
+  }
+  
 }
 ?>
diff --git a/common.inc.php b/common.inc.php
index 70ccb877..4163520b 100644
--- a/common.inc.php
+++ b/common.inc.php
@@ -5,6 +5,9 @@ $conf['endpoint']['describe']['output'] = 'rdf';
 $conf['endpoint']['config']['output'] = $conf['endpoint']['select']['output'];
 $conf['endpoint']['config']['named_graph'] = '';
 $conf['endpoint']['config']['show_inline'] = 0;
+//ALternative endpoints
+$conf['endpoint']['dbpedia'] = 'http://dbpedia.org/sparql';
+$conf['endpoint']['logd'] = 'http://logd.tw.rpi.edu/sparql';
 
 $conf['metadata']['db']['location'] = 'meta/db.sqlite';
 
diff --git a/index.php b/index.php
index c3ab0908..10b82b9e 100755
--- a/index.php
+++ b/index.php
@@ -13,8 +13,8 @@ include_once('classes/Queries.php');
 include_once('classes/Endpoint.php');
 include_once('classes/MetaDb.php');
 
-
-$endpoint = new Endpoint($conf['endpoint']['host'], $conf['endpoint']['config']);
+$endpoints = array();
+$endpoints['base'] = new Endpoint($conf['endpoint']['host'], $conf['endpoint']['config']);
 $metaDb = new MetaDb($conf['metadata']['db']['location']);
 
 $acceptContentType = Utils::getBestContentType($_SERVER['HTTP_ACCEPT']);
@@ -32,7 +32,7 @@ if($uri == $conf['basedir']){
   include_once($conf['special']['class']);
   $context = array();
   $context['contentType'] = $acceptContentType;
-  $context['endpoint'] = $endpoint;
+  $context['endpoint'] = $endpoints['base'];
   $sp = new SpecialFunction();
   $sp->execute($uri, $context);
   exit(0);
@@ -41,7 +41,7 @@ if($uri == $conf['basedir']){
 $pair = Queries::getMetadata($uri, $acceptContentType, $metaDb);
 
 if($pair == NULL){ // Original URI is not in metadata
-  if(Queries::uriExist($uri, $endpoint)){
+  if(Queries::uriExist($uri, $endpoints['base'])){
   	$page = Queries::createPage($uri, $acceptContentType, $metaDb);
   	if($page == NULL){
   	  Utils::send500(NULL);
@@ -67,7 +67,7 @@ $extension = Utils::getExtension($format);
 $acceptContentType = $format;
 
 //Check if files for model and view exist
-$curieType = Utils::uri2curie(Queries::getClass($uri, $endpoint));
+$curieType = Utils::uri2curie(Queries::getClass($uri, $endpoints['base']));
 $viewFile = $conf['view']['directory'].$curieType.$conf['view']['extension'].".".$extension;
 $modelFile = $conf['model']['directory'].$curieType.$conf['model']['extension'].".".$extension;
 if(!file_exists($modelFile) || !file_exists($viewFile) || $curieType == null){
@@ -75,23 +75,15 @@ if(!file_exists($modelFile) || !file_exists($viewFile) || $curieType == null){
   $viewFile = $conf['view']['directory'].$conf['view']['default'].$conf['view']['extension'].".".$extension;
 }
 
+$data = array();
 if(!is_dir($modelFile)){
   $query = file_get_contents($modelFile);
   $query = preg_replace("|".$conf['resource']['url_delimiter']."|", "<".$uri.">", $query);
-  $data['results'] = $endpoint->query($query, Utils::getResultsType($query));
+  $data['results'] = $endpoints['base']->query($query, Utils::getResultsType($query));
   $data['query'] = $query;
 }else{
   $modelDir = $modelFile;
-  $handle = opendir($modelDir);
-  while (false !== ($modelFile = readdir($handle))) {
-  	if($modelFile != "." && $modelFile != ".."){
-  	  $query = file_get_contents($modelDir."/".$modelFile);
-  	  $query = preg_replace("|".$conf['resource']['url_delimiter']."|", "<".$uri.">", $query);
-  	  $data[$modelFile]['results'] = $endpoint->query($query, Utils::getResultsType($query));
-  	  $data[$modelFile]['query'] = $query;
-  	}
-  }
-  closedir($handle);
+  $data = Utils::queryDir($modelDir, $endpoints);
 }
 
 Utils::processDocument($uri, $acceptContentType, $data, $viewFile);
diff --git a/models/local:AsDAsd.model.html/dbpedia/alla2 b/models/local:AsDAsd.model.html/dbpedia/alla2
new file mode 100644
index 00000000..037ad686
--- /dev/null
+++ b/models/local:AsDAsd.model.html/dbpedia/alla2
@@ -0,0 +1,3 @@
+SELECT ?s  ?o WHERE{
+?s a ?o .
+}LIMIT 10
-- 
GitLab