
prerna.ds.OwlTemporalEngineMeta Maven / Gradle / Ivy
The newest version!
package prerna.ds;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Vector;
import javax.crypto.Cipher;
import javax.crypto.CipherInputStream;
import javax.crypto.CipherOutputStream;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.openrdf.model.vocabulary.OWL;
import org.openrdf.model.vocabulary.RDF;
import org.openrdf.model.vocabulary.RDFS;
import org.openrdf.repository.Repository;
import org.openrdf.repository.RepositoryConnection;
import org.openrdf.repository.RepositoryException;
import org.openrdf.repository.sail.SailRepository;
import org.openrdf.rio.RDFFormat;
import org.openrdf.rio.RDFParseException;
import org.openrdf.rio.rdfxml.RDFXMLWriter;
import org.openrdf.sail.inferencer.fc.ForwardChainingRDFSInferencer;
import org.openrdf.sail.memory.MemoryStore;
import prerna.algorithm.api.SemossDataType;
import prerna.engine.api.IHeadersDataRow;
import prerna.engine.api.IRawSelectWrapper;
import prerna.engine.impl.rdf.InMemorySesameEngine;
import prerna.masterdatabase.utility.MetamodelVertex;
import prerna.query.querystruct.SelectQueryStruct;
import prerna.query.querystruct.selectors.IQuerySelector.SELECTOR_TYPE;
import prerna.query.querystruct.selectors.QueryColumnSelector;
import prerna.rdf.engine.wrappers.WrapperManager;
import prerna.util.Constants;
public class OwlTemporalEngineMeta {
private static final Logger classLogger = LogManager.getLogger(OwlTemporalEngineMeta.class);
private InMemorySesameEngine myEng;
private static final String SEMOSS_BASE = "http://semoss.org/ontologies";
private static final String SEMOSS_CONCEPT_PREFIX = "http://semoss.org/ontologies/Concept";
private static final String SEMOSS_PROPERTY_PREFIX = "http://semoss.org/ontologies/Relation/Contains";
private static final String SEMOSS_RELATION_PREFIX = "http://semoss.org/ontologies/Relation";
// specific uri's for in memory databases
private static final String IS_PRIM_KEY_PRED = "http://semoss.org/ontologies/Relation/Contains/IsPrimKey";
private static final String IS_DERIVED_PRED = "http://semoss.org/ontologies/Relation/Contains/IsDerived";
private static final String QUERY_STRUCT_PRED = "http://semoss.org/ontologies/Relation/Contains/QueryStructName";
private static final String ALIAS_PRED = "http://semoss.org/ontologies/Relation/Contains/Alias";
private static final String ORDERING_PRED = "http://semoss.org/ontologies/Relation/Contains/Ordering";
private static final String ADDTL_DATATYPE_PRED = "http://semoss.org/ontologies/Relation/Contains/AddtlDataType";
// if opaque selector, need to store it
private static final String QUERY_SELECTOR_COMPLEX_PRED = "http://semoss.org/ontologies/Relation/Contains/IsComplex";
private static final String QUERY_SELECTOR_TYPE_PRED = "http://semoss.org/ontologies/Relation/Contains/QuerySelectorType";
private static final String QUERY_SELECTOR_AS_STRING_PRED = "http://semoss.org/ontologies/Relation/Contains/QuerySelector";
// specific for tinker
private static final String PHYSICAL_PRED = "http://semoss.org/ontologies/Relation/Contains/Physical";
/**
* Constructor
*/
public OwlTemporalEngineMeta() {
// generate the in memory rc
RepositoryConnection rc = null;
try {
Repository myRepository = new SailRepository(new ForwardChainingRDFSInferencer(new MemoryStore()));
myRepository.initialize();
rc = myRepository.getConnection();
} catch(RuntimeException e) {
classLogger.error(Constants.STACKTRACE, e);
} catch (RepositoryException e) {
classLogger.error(Constants.STACKTRACE, e);
}
// set the rc in the in-memory engine
this.myEng = new InMemorySesameEngine();
this.myEng.setRepositoryConnection(rc);
this.myEng.setEngineId(Constants.OWL_TEMPORAL_ENGINE_META);
}
public OwlTemporalEngineMeta(String filePath, Cipher cipher) {
// generate the in memory rc
RepositoryConnection rc = null;
try {
Repository myRepository = new SailRepository(new ForwardChainingRDFSInferencer(new MemoryStore()));
myRepository.initialize();
rc = myRepository.getConnection();
File file = new File(filePath);
// load in the meta from saved file
if(cipher != null) {
try (InputStreamReader is = new InputStreamReader(new CipherInputStream(new FileInputStream(file), cipher))){
rc.add(is, SEMOSS_BASE, RDFFormat.RDFXML);
}
} else {
rc.add(file, SEMOSS_BASE, RDFFormat.RDFXML);
}
} catch(RuntimeException e) {
classLogger.error(Constants.STACKTRACE, e);
} catch (RepositoryException e) {
classLogger.error(Constants.STACKTRACE, e);
} catch (RDFParseException e) {
classLogger.error(Constants.STACKTRACE, e);
} catch (IOException e) {
classLogger.error(Constants.STACKTRACE, e);
}
// set the rc in the in-memory engine
this.myEng = new InMemorySesameEngine();
this.myEng.setRepositoryConnection(rc);
this.myEng.setEngineId(Constants.OWL_TEMPORAL_ENGINE_META);
}
public boolean isOpen() {
return this.myEng.isConnected();
}
/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////
/*
* METHODS PERTAINING TO A VERTEX
*/
public void addVertex(String vertexName) {
String sub = "";
String pred = "";
String obj = "";
// store the unique name as a concept
sub = SEMOSS_CONCEPT_PREFIX + "/" + vertexName;
pred = RDFS.SUBCLASSOF.toString();
obj = SEMOSS_CONCEPT_PREFIX;
this.myEng.addStatement(new Object[]{sub, pred, obj, true});
// add the unique name as an alias as well
// setAliasToVertex(vertexName, vertexName);
}
public void setDataTypeToVertex(String vertexName, String dataType) {
String sub = "";
String pred = "";
String obj = "";
// store the unique name as a concept
sub = SEMOSS_CONCEPT_PREFIX + "/" + vertexName;
pred = OWL.DATATYPEPROPERTY.toString();
obj = dataType;
if (obj == null) {
obj = (SemossDataType.STRING).toString();
} else {
// ensure standardization
obj = (SemossDataType.convertStringToDataType(obj)).toString();
}
this.myEng.addStatement(new Object[] { sub, pred, obj, false });
}
public void setAddtlDataTypeToVertex(String vertexName, String adtlDataType) {
String sub = "";
String pred = "";
String obj = "";
// store the unique name as a concept
sub = SEMOSS_CONCEPT_PREFIX + "/" + vertexName;
pred = ADDTL_DATATYPE_PRED;
obj = adtlDataType;
this.myEng.addStatement(new Object[] { sub, pred, obj, false });
}
public void setPrimKeyToVertex(String vertexName, boolean isPrimKey) {
String sub = "";
String pred = "";
boolean obj = false;
// store the unique name as a concept
sub = SEMOSS_CONCEPT_PREFIX + "/" + vertexName;
pred = IS_PRIM_KEY_PRED;
obj = isPrimKey;
this.myEng.addStatement(new Object[]{sub, pred, obj, false});
}
public void setDerivedToVertex(String vertexName, boolean isDerived) {
String sub = "";
String pred = "";
boolean obj = false;
// store the unique name as a concept
sub = SEMOSS_CONCEPT_PREFIX + "/" + vertexName;
pred = IS_DERIVED_PRED;
obj = isDerived;
this.myEng.addStatement(new Object[]{sub, pred, obj, false});
}
public void setQueryStructNameToVertex(String vertexName, String engineName, String qsName) {
String sub = "";
String pred = "";
String obj = "";
// store the unique name as a concept
sub = SEMOSS_CONCEPT_PREFIX + "/" + vertexName;
pred = QUERY_STRUCT_PRED;
obj = engineName + ":::" + qsName;
this.myEng.addStatement(new Object[]{sub, pred, obj, false});
}
public void setAliasToVertex(String vertexName, String alias) {
String sub = "";
String pred = "";
String obj = "";
// store the unique name as a concept
sub = SEMOSS_CONCEPT_PREFIX + "/" + vertexName;
pred = ALIAS_PRED;
obj = alias;
this.myEng.addStatement(new Object[]{sub, pred, obj, false});
}
/**
* Currently, this is only used by tinker when on the meta we create a
* System_2 node but the actual tinker vertices are type System
* @param vertexName
* @param physical
*/
public void setPhysicalNameToVertex(String vertexName, String physical) {
String sub = "";
String pred = "";
String obj = "";
// store the unique name as a concept
sub = SEMOSS_CONCEPT_PREFIX + "/" + vertexName;
pred = PHYSICAL_PRED;
obj = physical;
this.myEng.addStatement(new Object[]{sub, pred, obj, false});
}
/*
* The following are used for native frame selectors which requires a bit more work
* since we need to construct the selector type to get the syntax
*/
public void setSelectorComplexToVertex(String vertexName, boolean isComplex) {
String sub = "";
String pred = "";
boolean obj = false;
// store the unique name as a concept
sub = SEMOSS_CONCEPT_PREFIX + "/" + vertexName;
pred = QUERY_SELECTOR_COMPLEX_PRED;
obj = isComplex;
this.myEng.addStatement(new Object[]{sub, pred, obj, false});
}
public void setSelectorTypeToVertex(String vertexName, SELECTOR_TYPE selectorType) {
String sub = "";
String pred = "";
String obj = "";
// store the unique name as a concept
sub = SEMOSS_CONCEPT_PREFIX + "/" + vertexName;
pred = QUERY_SELECTOR_TYPE_PRED;
obj = selectorType.toString();
this.myEng.addStatement(new Object[]{sub, pred, obj, false});
}
public void setSelectorTypeToVertex(String vertexName, String selectorType) {
String sub = "";
String pred = "";
String obj = "";
// store the unique name as a concept
sub = SEMOSS_CONCEPT_PREFIX + "/" + vertexName;
pred = QUERY_SELECTOR_TYPE_PRED;
obj = selectorType;
this.myEng.addStatement(new Object[]{sub, pred, obj, false});
}
public void setSelectorObjectToVertex(String vertexName, String jsonSelectorObject) {
String sub = "";
String pred = "";
String obj = "";
// store the unique name as a concept
sub = SEMOSS_CONCEPT_PREFIX + "/" + vertexName;
pred = QUERY_SELECTOR_AS_STRING_PRED;
obj = jsonSelectorObject;
this.myEng.addStatement(new Object[]{sub, pred, obj, false});
}
public void setSelectorComplexToProperty(String vertexName, boolean isComplex) {
String sub = "";
String pred = "";
boolean obj = false;
// store the unique name as a concept
sub = SEMOSS_PROPERTY_PREFIX + "/" + vertexName;
pred = QUERY_SELECTOR_COMPLEX_PRED;
obj = isComplex;
this.myEng.addStatement(new Object[]{sub, pred, obj, false});
}
public void setSelectorTypeToProperty(String vertexName, SELECTOR_TYPE selectorType) {
String sub = "";
String pred = "";
String obj = "";
// store the unique name as a concept
sub = SEMOSS_PROPERTY_PREFIX + "/" + vertexName;
pred = QUERY_SELECTOR_TYPE_PRED;
obj = selectorType.toString();
this.myEng.addStatement(new Object[]{sub, pred, obj, false});
}
public void setSelectorTypeToProperty(String vertexName, String selectorType) {
String sub = "";
String pred = "";
String obj = "";
// store the unique name as a concept
sub = SEMOSS_PROPERTY_PREFIX + "/" + vertexName;
pred = QUERY_SELECTOR_TYPE_PRED;
obj = selectorType;
this.myEng.addStatement(new Object[]{sub, pred, obj, false});
}
public void setSelectorObjectToProperty(String vertexName, String jsonSelectorObject) {
String sub = "";
String pred = "";
String obj = "";
// store the unique name as a concept
sub = SEMOSS_PROPERTY_PREFIX + "/" + vertexName;
pred = QUERY_SELECTOR_AS_STRING_PRED;
obj = jsonSelectorObject;
this.myEng.addStatement(new Object[]{sub, pred, obj, false});
}
/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////
/*
* METHODS PERTAINING TO A PROPERTY
*/
public void addProperty(String vertexName, String propertyName) {
String sub = "";
String pred = "";
String obj = "";
// store the property as a property
sub = SEMOSS_PROPERTY_PREFIX+ "/" + propertyName;
pred = RDF.TYPE.toString();
obj = SEMOSS_PROPERTY_PREFIX;
this.myEng.addStatement(new Object[]{sub, pred, obj, true});
// store the property for the provided concept
sub = SEMOSS_CONCEPT_PREFIX+ "/" + vertexName;
pred = SEMOSS_PROPERTY_PREFIX;
obj = SEMOSS_PROPERTY_PREFIX + "/" + propertyName;
this.myEng.addStatement(new Object[]{sub, pred, obj, true});
}
public void setDataTypeToProperty(String propertyName, String dataType) {
String sub = "";
String pred = "";
String obj = "";
// store the unique name as a concept
sub = SEMOSS_PROPERTY_PREFIX + "/" + propertyName;
pred = OWL.DATATYPEPROPERTY.toString();
obj = dataType;
if (obj == null) {
obj = (SemossDataType.STRING).toString();
} else {
// ensure standardization
obj = (SemossDataType.convertStringToDataType(obj)).toString();
}
this.myEng.addStatement(new Object[] { sub, pred, obj, false });
}
public void setAddtlDataTypeToProperty(String propertyName, String adtlDataType) {
String sub = "";
String pred = "";
String obj = "";
// store the unique name as a concept
sub = SEMOSS_PROPERTY_PREFIX + "/" + propertyName;
pred = ADDTL_DATATYPE_PRED;
obj = adtlDataType;
this.myEng.addStatement(new Object[] { sub, pred, obj, false });
}
public void setPrimKeyToProperty(String propertyName, boolean isPrimKey) {
String sub = "";
String pred = "";
boolean obj = false;
// store the unique name as a concept
sub = SEMOSS_PROPERTY_PREFIX + "/" + propertyName;
pred = IS_PRIM_KEY_PRED;
obj = isPrimKey;
this.myEng.addStatement(new Object[]{sub, pred, obj, false});
}
public void setDerivedToProperty(String propertyName, boolean isDerived) {
String sub = "";
String pred = "";
boolean obj = false;
// store the unique name as a concept
sub = SEMOSS_PROPERTY_PREFIX + "/" + propertyName;
pred = IS_DERIVED_PRED;
obj = isDerived;
this.myEng.addStatement(new Object[]{sub, pred, obj, false});
}
public void setQueryStructNameToProperty(String oropertyName, String engineName, String qsName) {
String sub = "";
String pred = "";
String obj = "";
// store the unique name as a concept
sub = SEMOSS_PROPERTY_PREFIX + "/" + oropertyName;
pred = QUERY_STRUCT_PRED;
obj = engineName + ":::" + qsName;
this.myEng.addStatement(new Object[]{sub, pred, obj, false});
}
public void setFullQueryStructNameToProperty(String oropertyName, String concatenatedQsInfo) {
String sub = "";
String pred = "";
String obj = "";
// store the unique name as a concept
sub = SEMOSS_PROPERTY_PREFIX + "/" + oropertyName;
pred = QUERY_STRUCT_PRED;
obj = concatenatedQsInfo;
this.myEng.addStatement(new Object[]{sub, pred, obj, false});
}
public void setAliasToProperty(String propertyName, String alias) {
String sub = "";
String pred = "";
String obj = "";
// store the unique name as a concept
sub = SEMOSS_PROPERTY_PREFIX + "/" + propertyName;
pred = ALIAS_PRED;
obj = alias;
this.myEng.addStatement(new Object[]{sub, pred, obj, false});
}
public void setOrderingToProperty(String propertyName, String orderedLevels) {
String sub = "";
String pred = "";
String obj = "";
// store the unique name as a concept
sub = SEMOSS_PROPERTY_PREFIX + "/" + propertyName;
pred = ORDERING_PRED;
obj = orderedLevels;
this.myEng.addStatement(new Object[]{sub, pred, obj, false});
}
/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////
/*
* METHODS PERTAINING TO ADDING RELATIONSHIPS
*/
public void addRelationship(String fromUniqueName, String toUniqueName, String relType) {
String sub = "";
String pred = "";
String obj = "";
// store the specific relation as a relation
sub = SEMOSS_RELATION_PREFIX + "/" + fromUniqueName + ":" + toUniqueName + ":" + relType;
pred = RDFS.SUBPROPERTYOF.toString();
obj = SEMOSS_RELATION_PREFIX;
this.myEng.addStatement(new Object[]{sub, pred, obj, true});
// store the relation between the two vertices
sub = SEMOSS_CONCEPT_PREFIX + "/" + fromUniqueName;
pred = SEMOSS_RELATION_PREFIX + "/" + fromUniqueName + ":" + toUniqueName + ":" + relType;
obj = SEMOSS_CONCEPT_PREFIX + "/" + toUniqueName;
this.myEng.addStatement(new Object[]{sub, pred, obj, true});
}
/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////
/**
* Get the list of database ids used in this frame
* @return
*/
public Set getDatabaseIds() {
Set eIds = new HashSet<>();
String query = "select distinct ?qs "
+ "where {"
+ "{"
+ "{?header <" + RDFS.SUBCLASSOF + "> <" + SEMOSS_CONCEPT_PREFIX + ">}"
+ "{?header <" + ALIAS_PRED + "> ?alias}"
+ "MINUS{?header <" + IS_PRIM_KEY_PRED + "> false}"
+ "{?header <" + QUERY_STRUCT_PRED + "> ?qs}"
+ "}"
+ "union"
+ "{"
+ "{?header <" + RDF.TYPE + "> <" + SEMOSS_PROPERTY_PREFIX + ">}"
+ "{?header <" + ALIAS_PRED + "> ?alias}"
+ "{?parent <" + SEMOSS_PROPERTY_PREFIX + "> ?header}"
+ "MINUS{?header <" + IS_PRIM_KEY_PRED + "> false}"
+ "{?header <" + QUERY_STRUCT_PRED + "> ?qs}"
+ "}"
+ "}";
IRawSelectWrapper it = null;
try {
it = WrapperManager.getInstance().getRawWrapper(this.myEng, query);
while(it.hasNext()) {
Object[] values = it.next().getValues();
String qsString = values[0].toString();
String[] split = qsString.split(":::");
String eId = split[0];
eIds.add(eId);
}
} catch (Exception e) {
classLogger.error(Constants.STACKTRACE, e);
} finally {
if(it != null) {
try {
it.close();
} catch (IOException e) {
classLogger.error(Constants.STACKTRACE, e);
}
}
}
return eIds;
}
/**
* Get the database information for all columns in a frame
* @return
*/
public Map> getDatabaseInformation() {
Map> ret = new HashMap>();
String query = "select distinct "
+ "?header "
+ "?alias "
+ "(coalesce(?qs, 'unknown') as ?qsName) "
+ "where {"
+ "{"
+ "{?header <" + RDFS.SUBCLASSOF + "> <" + SEMOSS_CONCEPT_PREFIX + ">}"
+ "{?header <" + ALIAS_PRED + "> ?alias}"
+ "MINUS{?header <" + IS_PRIM_KEY_PRED + "> false}"
+ "optional{?header <" + QUERY_STRUCT_PRED + "> ?qs}"
+ "}"
+ "union"
+ "{"
+ "{?header <" + RDF.TYPE + "> <" + SEMOSS_PROPERTY_PREFIX + ">}"
+ "{?header <" + ALIAS_PRED + "> ?alias}"
+ "{?parent <" + SEMOSS_PROPERTY_PREFIX + "> ?header}"
+ "MINUS{?header <" + IS_PRIM_KEY_PRED + "> false}"
+ "optional{?header <" + QUERY_STRUCT_PRED + "> ?qs}"
+ "}"
+ "}";
IRawSelectWrapper it = null;
try {
it = WrapperManager.getInstance().getRawWrapper(this.myEng, query);
while(it.hasNext()) {
Object[] values = it.next().getValues();
String header = values[0].toString();
String alias = values[1].toString();
String qsString = values[2].toString();
String[] split = null;
if(qsString.equals("unknown")) {
split = new String[] {alias};
} else {
split = qsString.split(":::");
}
List retList = null;
if(ret.containsKey(header)) {
retList = ret.get(header);
} else {
retList = new Vector();
ret.put(header, retList);
}
retList.add(split);
}
} catch (Exception e) {
classLogger.error(Constants.STACKTRACE, e);
} finally {
if(it != null) {
try {
it.close();
} catch (IOException e) {
classLogger.error(Constants.STACKTRACE, e);
}
}
}
return ret;
}
public List getDatabaseInformation(String uniqueName) {
String query = "select distinct "
+ "?header "
+ "(coalesce(?qs, 'unknown') as ?qsName) "
+ "where {"
+ "{"
+ "bind(<" + SEMOSS_CONCEPT_PREFIX + "/" + uniqueName + "> as ?header)"
+ "{?header <" + RDFS.SUBCLASSOF + "> <" + SEMOSS_CONCEPT_PREFIX + ">}"
+ "optional{?header <" + QUERY_STRUCT_PRED + "> ?qs}"
+ "}"
+ "union"
+ "{"
+ "bind(<" + SEMOSS_PROPERTY_PREFIX + "/" + uniqueName + "> as ?header)"
+ "{?header <" + RDF.TYPE + "> <" + SEMOSS_PROPERTY_PREFIX + ">}"
+ "{?parent <" + SEMOSS_PROPERTY_PREFIX + "> ?header}"
+ "optional{?header <" + QUERY_STRUCT_PRED + "> ?qs}"
+ "}"
+ "}";
List ret = new Vector();
IRawSelectWrapper it = null;
try {
it = WrapperManager.getInstance().getRawWrapper(this.myEng, query);
while(it.hasNext()) {
Object[] values = it.next().getValues();
String qsString = values[1].toString();
String[] split = qsString.split(":::");
ret.add(split);
}
} catch (Exception e) {
classLogger.error(Constants.STACKTRACE, e);
} finally {
if(it != null) {
try {
it.close();
} catch (IOException e) {
classLogger.error(Constants.STACKTRACE, e);
}
}
}
return ret;
}
/**
* Need to validate if a unique name for a table or property is valid
* Return of true means it is valid
* Return of false means it is not valid
* @param uniqueName
* @return
*/
public boolean validateUniqueName(String uniqueName) {
String query = "select distinct ?header "
+ "where {"
+ "{"
+ "bind(<" + SEMOSS_CONCEPT_PREFIX + "/" + uniqueName + "> as ?header)"
+ "{?header <" + RDFS.SUBCLASSOF + "> <" + SEMOSS_CONCEPT_PREFIX + ">}"
+ "}"
+ "union"
+ "{"
+ "bind(<" + SEMOSS_PROPERTY_PREFIX + "/" + uniqueName + "> as ?header)"
+ "{?header <" + RDF.TYPE + "> <" + SEMOSS_PROPERTY_PREFIX + ">}"
+ "}"
+ "} limit 1";
IRawSelectWrapper it = null;
try {
it = WrapperManager.getInstance().getRawWrapper(this.myEng, query);
if(it.hasNext()) {
return true;
}
} catch (Exception e) {
classLogger.error(Constants.STACKTRACE, e);
} finally {
if(it != null) {
try {
it.close();
} catch (IOException e) {
classLogger.error(Constants.STACKTRACE, e);
}
}
}
return false;
}
public List getUniqueNames() {
String query = "select distinct ?header where {"
+ "{"
+ "{?header <" + RDFS.SUBCLASSOF + "> <" + SEMOSS_CONCEPT_PREFIX + ">}"
+ "}"
+ "UNION"
+ "{"
+ "{?header <" + RDF.TYPE + "> <" + SEMOSS_PROPERTY_PREFIX + ">}"
+ "}"
+ "}";
List uNames = new Vector();
IRawSelectWrapper it = null;
try {
it = WrapperManager.getInstance().getRawWrapper(this.myEng, query);
while(it.hasNext()) {
uNames.add(it.next().getValues()[0].toString());
}
} catch (Exception e) {
classLogger.error(Constants.STACKTRACE, e);
} finally {
if(it != null) {
try {
it.close();
} catch (IOException e) {
classLogger.error(Constants.STACKTRACE, e);
}
}
}
return uNames;
}
public String getUniqueNameFromAlias(String alias) {
String query = "select distinct ?header where {"
+ "{"
+ "{?header <" + RDFS.SUBCLASSOF + "> <" + SEMOSS_CONCEPT_PREFIX + ">}"
+ "{?header <" + ALIAS_PRED + "> \"" + alias + "\"}"
+ "}"
+ "UNION"
+ "{"
+ "{?header <" + RDF.TYPE + "> <" + SEMOSS_PROPERTY_PREFIX + ">}"
+ "{?header <" + ALIAS_PRED + "> \"" + alias + "\"}"
+ "}"
+ "}";
IRawSelectWrapper it = null;
try {
it = WrapperManager.getInstance().getRawWrapper(this.myEng, query);
if(it.hasNext()) {
return it.next().getValues()[0].toString();
}
} catch (Exception e) {
classLogger.error(Constants.STACKTRACE, e);
} finally {
if(it != null) {
try {
it.close();
} catch (IOException e) {
classLogger.error(Constants.STACKTRACE, e);
}
}
}
return null;
}
public Map getUniqueNameToAlias() {
String query = "select distinct ?header ?alias where {"
+ "{"
+ "{?header <" + RDFS.SUBCLASSOF + "> <" + SEMOSS_CONCEPT_PREFIX + ">}"
+ "{?header <" + ALIAS_PRED + "> ?alias}"
+ "}"
+ "UNION"
+ "{"
+ "{?header <" + RDF.TYPE + "> <" + SEMOSS_PROPERTY_PREFIX + ">}"
+ "{?header <" + ALIAS_PRED + "> ?alias}"
+ "}"
+ "}";
Map retMap = new HashMap();
IRawSelectWrapper it = null;
try {
it = WrapperManager.getInstance().getRawWrapper(this.myEng, query);
if(it.hasNext()) {
Object[] values = it.next().getValues();
retMap.put(values[0].toString(), values[1].toString());
}
} catch (Exception e) {
classLogger.error(Constants.STACKTRACE, e);
} finally {
if(it != null) {
try {
it.close();
} catch (IOException e) {
classLogger.error(Constants.STACKTRACE, e);
}
}
}
return retMap;
}
public String getAliasFromUniqueName(String uniqueName) {
String query = "select distinct ?header ?alias where {"
+ "{"
+ "bind(<" + SEMOSS_CONCEPT_PREFIX + "/" + uniqueName + "> as ?header)"
+ "{?header <" + RDFS.SUBCLASSOF + "> <" + SEMOSS_CONCEPT_PREFIX + ">}"
+ "{?header <" + ALIAS_PRED + "> ?alias}"
+ "}"
+ "UNION"
+ "{"
+ "bind(<" + SEMOSS_PROPERTY_PREFIX + "/" + uniqueName + "> as ?header)"
+ "{?header <" + RDF.TYPE + "> <" + SEMOSS_PROPERTY_PREFIX + ">}"
+ "{?header <" + ALIAS_PRED + "> ?alias}"
+ "}"
+ "}";
IRawSelectWrapper it = null;
try {
it = WrapperManager.getInstance().getRawWrapper(this.myEng, query);
if(it.hasNext()) {
Object[] values = it.next().getValues();
return values[1].toString();
}
} catch (Exception e) {
classLogger.error(Constants.STACKTRACE, e);
} finally {
if(it != null) {
try {
it.close();
} catch (IOException e) {
classLogger.error(Constants.STACKTRACE, e);
}
}
}
return null;
}
public Object[] getComplexSelector(String uniqueName) {
String query = "select distinct "
+ "?header "
+ "?queryType "
+ "?queryJson "
+ "where {"
+ "{"
+ "bind(<" + SEMOSS_CONCEPT_PREFIX + "/" + uniqueName + "> as ?header)"
+ "{?header <" + QUERY_SELECTOR_COMPLEX_PRED + "> \"true\"^^xsd:boolean}"
+ "{?header <" + QUERY_SELECTOR_TYPE_PRED + "> ?queryType}"
+ "{?header <" + QUERY_SELECTOR_AS_STRING_PRED + "> ?queryJson}"
+ "} UNION {"
+ "bind(<" + SEMOSS_PROPERTY_PREFIX + "/" + uniqueName + "> as ?header)"
+ "{?header <" + QUERY_SELECTOR_COMPLEX_PRED + "> \"true\"^^xsd:boolean}"
+ "{?header <" + QUERY_SELECTOR_TYPE_PRED + "> ?queryType}"
+ "{?header <" + QUERY_SELECTOR_AS_STRING_PRED + "> ?queryJson}"
+ "}"
+ "}";
IRawSelectWrapper it = null;
try {
it = WrapperManager.getInstance().getRawWrapper(this.myEng, query);
if(it.hasNext()) {
return it.next().getValues();
}
} catch (Exception e) {
classLogger.error(Constants.STACKTRACE, e);
} finally {
if(it != null) {
try {
it.close();
} catch (IOException e) {
classLogger.error(Constants.STACKTRACE, e);
}
}
}
return null;
}
/*
* Flush out the data from the OWL to a POJO
* This is the return we want from the FE so we know Table and Column
*/
public List getFrameSelectors() {
String query = "select distinct "
+ "?header (coalesce(?prim, 'false') as ?isPrim) "
+ "(coalesce(lcase(?alias), lcase(?header)) as ?loweralias) "
+ "where {"
+ "{"
+ "{?header <" + RDFS.SUBCLASSOF + "> <" + SEMOSS_CONCEPT_PREFIX + ">}"
+ "optional{?header <" + IS_PRIM_KEY_PRED + "> ?prim}"
+ "optional{?header <" + ALIAS_PRED + "> ?alias}"
+ "}"
+ "union"
+ "{"
+ "{?header <" + RDF.TYPE + "> <" + SEMOSS_PROPERTY_PREFIX + ">}"
+ "optional{?header <" + IS_PRIM_KEY_PRED + "> ?prim}"
+ "optional{?header <" + ALIAS_PRED + "> ?alias}"
+ "}"
+ "filter(?header != <" + SEMOSS_CONCEPT_PREFIX + "> && "
+ "?header != <" + SEMOSS_PROPERTY_PREFIX + ">)"
+ "} order by ?loweralias";
List headers = new Vector();
IRawSelectWrapper it = null;
try {
it = WrapperManager.getInstance().getRawWrapper(this.myEng, query);
while(it.hasNext()) {
Object[] row = it.next().getValues();
if(row[1].equals("false")) {
headers.add(row[0].toString());
}
}
} catch (Exception e) {
classLogger.error(Constants.STACKTRACE, e);
} finally {
if(it != null) {
try {
it.close();
} catch (IOException e) {
classLogger.error(Constants.STACKTRACE, e);
}
}
}
return headers;
}
/**
* This returns the list of unique names
* @return
*/
public List getOrderedAliasOrUniqueNames() {
String query = "select distinct "
+ "(coalesce(?alias, ?header) as ?frameName) "
+ "(coalesce(?prim, 'false') as ?isPrim) "
+ "(coalesce(lcase(?alias), lcase(?header)) as ?loweralias) "
+ "where {"
+ "{"
+ "{?header <" + RDFS.SUBCLASSOF + "> <" + SEMOSS_CONCEPT_PREFIX + ">}"
+ "optional{?header <" + IS_PRIM_KEY_PRED + "> ?prim}"
+ "optional{?header <" + ALIAS_PRED + "> ?alias}"
+ "}"
+ "union"
+ "{"
+ "{?header <" + RDF.TYPE + "> <" + SEMOSS_PROPERTY_PREFIX + ">}"
+ "optional{?header <" + IS_PRIM_KEY_PRED + "> ?prim}"
+ "optional{?header <" + ALIAS_PRED + "> ?alias}"
+ "}"
+ "filter(?header != <" + SEMOSS_CONCEPT_PREFIX + "> && "
+ "?header != <" + SEMOSS_PROPERTY_PREFIX + ">)"
+ "} order by ?loweralias";
List headers = new Vector();
IRawSelectWrapper it = null;
try {
it = WrapperManager.getInstance().getRawWrapper(this.myEng, query);
while(it.hasNext()) {
Object[] row = it.next().getValues();
if(row[1].equals("false")) {
headers.add(row[0].toString());
}
}
} catch (Exception e) {
classLogger.error(Constants.STACKTRACE, e);
} finally {
if(it != null) {
try {
it.close();
} catch (IOException e) {
classLogger.error(Constants.STACKTRACE, e);
}
}
}
return headers;
}
/**
* Get the physical name for a unique name
* @param uniqueName
* @return
*/
public String getPhysicalName(String uniqueName) {
String query = "select distinct "
+ "?header ?physical "
+ "where {"
+ "bind(<" + SEMOSS_CONCEPT_PREFIX + "/" + uniqueName + "> as ?header)"
+ "{?header <" + RDFS.SUBCLASSOF + "> <" + SEMOSS_CONCEPT_PREFIX + ">}"
+ "{?header <" + PHYSICAL_PRED + "> ?physical}"
+ "}";
IRawSelectWrapper it = null;
try {
it = WrapperManager.getInstance().getRawWrapper(this.myEng, query);
while(it.hasNext()) {
Object[] row = it.next().getValues();
return row[1].toString();
}
} catch (Exception e) {
classLogger.error(Constants.STACKTRACE, e);
} finally {
if(it != null) {
try {
it.close();
} catch (IOException e) {
classLogger.error(Constants.STACKTRACE, e);
}
}
}
return uniqueName;
}
/*
* Flush out the relationships from the OWL to a POJO
*/
public List getAllRelationships() {
String query = "select ?fromNode ?toNode ?rel where {"
+ "{?fromNode <" + RDFS.SUBCLASSOF + "> <" + SEMOSS_CONCEPT_PREFIX + ">}"
+ "{?toNode <" + RDFS.SUBCLASSOF + "> <" + SEMOSS_CONCEPT_PREFIX + ">}"
+ "{?rel <" + RDFS.SUBPROPERTYOF + "> <" + SEMOSS_RELATION_PREFIX + ">}"
+ "{?fromNode ?rel ?toNode}"
+ "filter(?rel != <" + SEMOSS_RELATION_PREFIX + ">)"
+ "}";
List relationships = new Vector();
IRawSelectWrapper it = null;
try {
it = WrapperManager.getInstance().getRawWrapper(this.myEng, query);
while(it.hasNext()) {
Object[] row = it.next().getValues();
relationships.add(new String[]{row[0].toString(), row[1].toString(), row[2].toString().split(":")[2]});
}
} catch (Exception e) {
classLogger.error(Constants.STACKTRACE, e);
} finally {
if(it != null) {
try {
it.close();
} catch (IOException e) {
classLogger.error(Constants.STACKTRACE, e);
}
}
}
return relationships;
}
/**
* Get all upstream relationships to the node
* This means the input node is the target
* @param node
* @return
*/
public List getUpstreamRelationships(String node) {
String query = "select ?fromNode ?toNode ?rel where {"
+ "bind(<" + SEMOSS_CONCEPT_PREFIX + "/" + node + "> as ?toNode)"
+ "{?fromNode <" + RDFS.SUBCLASSOF + "> <" + SEMOSS_CONCEPT_PREFIX + ">}"
+ "{?toNode <" + RDFS.SUBCLASSOF + "> <" + SEMOSS_CONCEPT_PREFIX + ">}"
+ "{?rel <" + RDFS.SUBPROPERTYOF + "> <" + SEMOSS_RELATION_PREFIX + ">}"
+ "{?fromNode ?rel ?toNode}"
+ "filter(?rel != <" + SEMOSS_RELATION_PREFIX + ">)"
+ "}";
List relationships = new Vector();
IRawSelectWrapper it = null;
try {
it = WrapperManager.getInstance().getRawWrapper(this.myEng, query);
while(it.hasNext()) {
Object[] row = it.next().getValues();
relationships.add(new String[]{row[0].toString(), row[1].toString(), row[2].toString().split(":")[2]});
}
} catch (Exception e) {
classLogger.error(Constants.STACKTRACE, e);
} finally {
if(it != null) {
try {
it.close();
} catch (IOException e) {
classLogger.error(Constants.STACKTRACE, e);
}
}
}
return relationships;
}
/**
* Get all downstream relationships to the node
* This means the input node is the source
* @param node
* @return
*/
public List getDownstreamRelationships(String node) {
String query = "select ?fromNode ?toNode ?rel where {"
+ "bind(<" + SEMOSS_CONCEPT_PREFIX + "/" + node + "> as ?fromNode)"
+ "{?fromNode <" + RDFS.SUBCLASSOF + "> <" + SEMOSS_CONCEPT_PREFIX + ">}"
+ "{?toNode <" + RDFS.SUBCLASSOF + "> <" + SEMOSS_CONCEPT_PREFIX + ">}"
+ "{?rel <" + RDFS.SUBPROPERTYOF + "> <" + SEMOSS_RELATION_PREFIX + ">}"
+ "{?fromNode ?rel ?toNode}"
+ "filter(?rel != <" + SEMOSS_RELATION_PREFIX + ">)"
+ "}";
List relationships = new Vector();
IRawSelectWrapper it = null;
try {
it = WrapperManager.getInstance().getRawWrapper(this.myEng, query);
while(it.hasNext()) {
Object[] row = it.next().getValues();
relationships.add(new String[]{row[0].toString(), row[1].toString(), row[2].toString().split(":")[2]});
}
} catch (Exception e) {
classLogger.error(Constants.STACKTRACE, e);
} finally {
if(it != null) {
try {
it.close();
} catch (IOException e) {
classLogger.error(Constants.STACKTRACE, e);
}
}
}
return relationships;
}
public Map getHeaderToTypeMap() {
String query = "select distinct ?header ?datatype where {"
+ "{"
+ "{?header <" + RDFS.SUBCLASSOF + "> <" + SEMOSS_CONCEPT_PREFIX + ">}"
+ "{?header <" + OWL.DATATYPEPROPERTY + "> ?datatype}"
+ "}"
+ "union"
+ "{"
+ "{?header <" + RDF.TYPE + "> <" + SEMOSS_PROPERTY_PREFIX + ">}"
+ "{?header <" + OWL.DATATYPEPROPERTY + "> ?datatype}"
+ "}"
+ "}";
Map returnMap = new HashMap();
IRawSelectWrapper it = null;
try {
it = WrapperManager.getInstance().getRawWrapper(this.myEng, query);
while(it.hasNext()) {
Object[] row = it.next().getValues();
returnMap.put(row[0].toString(), SemossDataType.convertStringToDataType(row[1].toString()));
}
} catch (Exception e) {
classLogger.error(Constants.STACKTRACE, e);
} finally {
if(it != null) {
try {
it.close();
} catch (IOException e) {
classLogger.error(Constants.STACKTRACE, e);
}
}
}
return returnMap;
}
public Map getHeaderToAdtlTypeMap() {
String query = "select distinct ?header ?adtlDataType where {"
+ "{"
+ "{?header <" + RDFS.SUBCLASSOF + "> <" + SEMOSS_CONCEPT_PREFIX + ">}"
+ "{?header <" + ADDTL_DATATYPE_PRED + "> ?adtlDataType}"
+ "}"
+ "union"
+ "{"
+ "{?header <" + RDF.TYPE + "> <" + SEMOSS_PROPERTY_PREFIX + ">}"
+ "{?header <" + ADDTL_DATATYPE_PRED + "> ?adtlDataType}"
+ "}"
+ "}";
Map returnMap = new HashMap();
IRawSelectWrapper it = null;
try {
it = WrapperManager.getInstance().getRawWrapper(this.myEng, query);
while(it.hasNext()) {
Object[] row = it.next().getValues();
returnMap.put(row[0].toString(), row[1].toString());
}
} catch (Exception e) {
classLogger.error(Constants.STACKTRACE, e);
} finally {
if(it != null) {
try {
it.close();
} catch (IOException e) {
classLogger.error(Constants.STACKTRACE, e);
}
}
}
return returnMap;
}
public SemossDataType getHeaderTypeAsEnum(String uniqueName) {
String parent = null;
if(uniqueName.contains("__")) {
parent = uniqueName.split("__")[0];
}
return getHeaderTypeAsEnum(uniqueName, parent);
}
private SemossDataType getHeaderTypeAsEnum(String uniqueName, String parentUniqueName) {
String query = null;
if(parentUniqueName == null || parentUniqueName.isEmpty()) {
// we have a concept
query = "select distinct ?header ?datatype where {"
+ "bind(<" + SEMOSS_CONCEPT_PREFIX + "/" + uniqueName + "> as ?header)"
+ "{?header <" + RDFS.SUBCLASSOF + "> <" + SEMOSS_CONCEPT_PREFIX + ">}"
+ "{?header <" + OWL.DATATYPEPROPERTY + "> ?datatype}"
+ "}";
} else {
// we have a property
query = "select distinct ?header ?datatype where {"
+ "bind(<" + SEMOSS_PROPERTY_PREFIX + "/" + uniqueName + "> as ?header)"
+ "{?header <" + RDF.TYPE + "> <" + SEMOSS_PROPERTY_PREFIX + ">}"
+ "{?header <" + OWL.DATATYPEPROPERTY + "> ?datatype}"
// in case you do a funky load
// and load a property without its parent
// we shouldn't bind and assume there is a parent present
// + "bind(<" + SEMOSS_CONCEPT_PREFIX + "/" + parentUniqueName + "> as ?parent)"
// + "{?parent <" + RDFS.SUBCLASSOF + "> <" + SEMOSS_CONCEPT_PREFIX + ">}"
// + "{?parent <" + SEMOSS_PROPERTY_PREFIX + "> ?header}"
+ "}";
}
IRawSelectWrapper it = null;
try {
it = WrapperManager.getInstance().getRawWrapper(this.myEng, query);
while(it.hasNext()) {
Object[] row = it.next().getValues();
return SemossDataType.convertStringToDataType(row[1].toString());
}
} catch (Exception e) {
classLogger.error(Constants.STACKTRACE, e);
} finally {
if(it != null) {
try {
it.close();
} catch (IOException e) {
classLogger.error(Constants.STACKTRACE, e);
}
}
}
return null;
}
public String getHeaderTypeAsString(String uniqueName) {
String parent = null;
if(uniqueName.contains("__")) {
parent = uniqueName.split("__")[0];
}
return getHeaderTypeAsString(uniqueName, parent);
}
public String getHeaderTypeAsString(String uniqueName, String parentUniqueName) {
String query = null;
if(parentUniqueName == null || parentUniqueName.isEmpty()) {
// we have a concept
query = "select distinct ?header ?datatype where {"
+ "bind(<" + SEMOSS_CONCEPT_PREFIX + "/" + uniqueName + "> as ?header)"
+ "{?header <" + RDFS.SUBCLASSOF + "> <" + SEMOSS_CONCEPT_PREFIX + ">}"
+ "{?header <" + OWL.DATATYPEPROPERTY + "> ?datatype}"
+ "}";
} else {
// we have a property
query = "select distinct ?header ?datatype where {"
+ "bind(<" + SEMOSS_PROPERTY_PREFIX + "/" + uniqueName + "> as ?header)"
+ "{?header <" + RDF.TYPE + "> <" + SEMOSS_PROPERTY_PREFIX + ">}"
// in case you do a funky load
// and load a property without its parent
// we shouldn't bind and assume there is a parent present
// + "bind(<" + SEMOSS_CONCEPT_PREFIX + "/" + parentUniqueName + "> as ?parent)"
// + "{?parent <" + RDFS.SUBCLASSOF + "> <" + SEMOSS_CONCEPT_PREFIX + ">}"
// + "{?parent <" + SEMOSS_PROPERTY_PREFIX + "> ?header}"
+ "{?header <" + OWL.DATATYPEPROPERTY + "> ?datatype}"
+ "}";
}
IRawSelectWrapper it = null;
try {
it = WrapperManager.getInstance().getRawWrapper(this.myEng, query);
while(it.hasNext()) {
Object[] row = it.next().getValues();
return row[1].toString();
}
} catch (Exception e) {
classLogger.error(Constants.STACKTRACE, e);
} finally {
if(it != null) {
try {
it.close();
} catch (IOException e) {
classLogger.error(Constants.STACKTRACE, e);
}
}
}
return null;
}
public String getHeaderAdtlType(String uniqueName) {
String parent = null;
if(uniqueName.contains("__")) {
parent = uniqueName.split("__")[0];
}
return getHeaderAdtlType(uniqueName, parent);
}
public String getHeaderAdtlType(String uniqueName, String parentUniqueName) {
String query = null;
if(parentUniqueName == null || parentUniqueName.isEmpty()) {
// we have a concept
query = "select distinct ?header ?adtlDataType where {"
+ "bind(<" + SEMOSS_CONCEPT_PREFIX + "/" + uniqueName + "> as ?header)"
+ "{?header <" + RDFS.SUBCLASSOF + "> <" + SEMOSS_CONCEPT_PREFIX + ">}"
+ "{?header <" + ADDTL_DATATYPE_PRED + "> ?adtlDataType}"
+ "}";
} else {
// we have a property
query = "select distinct ?header ?adtlDataType where {"
+ "bind(<" + SEMOSS_PROPERTY_PREFIX + "/" + uniqueName + "> as ?header)"
+ "{?header <" + RDF.TYPE + "> <" + SEMOSS_PROPERTY_PREFIX + ">}"
// + "bind(<" + SEMOSS_CONCEPT_PREFIX + "/" + parentUniqueName + "> as ?parent)"
// + "{?parent <" + RDFS.SUBCLASSOF + "> <" + SEMOSS_CONCEPT_PREFIX + ">}"
// + "{?parent <" + SEMOSS_PROPERTY_PREFIX + "> ?header}"
+ "{?header <" + ADDTL_DATATYPE_PRED + "> ?adtlDataType}"
+ "}";
}
IRawSelectWrapper it = null;
try {
it = WrapperManager.getInstance().getRawWrapper(this.myEng, query);
while(it.hasNext()) {
Object[] row = it.next().getValues();
return row[1].toString();
}
} catch (Exception e) {
classLogger.error(Constants.STACKTRACE, e);
} finally {
if(it != null) {
try {
it.close();
} catch (IOException e) {
classLogger.error(Constants.STACKTRACE, e);
}
}
}
return null;
}
/**
* Get the headers to the app / qs information it came from
* @return
*/
public Map> getHeaderToSources() {
String query = "select distinct ?header ?qsInfo where {"
+ "{"
+ "{?header <" + RDFS.SUBCLASSOF + "> <" + SEMOSS_CONCEPT_PREFIX + ">}"
+ "{?header <" + QUERY_STRUCT_PRED + "> ?qsInfo}"
+ "}"
+ "union"
+ "{"
+ "{?header <" + RDF.TYPE + "> <" + SEMOSS_PROPERTY_PREFIX + ">}"
+ "{?header <" + QUERY_STRUCT_PRED + "> ?qsInfo}"
+ "}"
+ "}";
Map> returnMap = new HashMap<>();
IRawSelectWrapper it = null;
try {
it = WrapperManager.getInstance().getRawWrapper(this.myEng, query);
while(it.hasNext()) {
Object[] row = it.next().getValues();
String header = row[0].toString();
String qsInfo = row[1].toString();
if(returnMap.containsKey(header)) {
returnMap.get(header).add(qsInfo);
} else {
List sources = new Vector();
sources.add(qsInfo);
returnMap.put(header, sources);
}
}
} catch (Exception e) {
classLogger.error(Constants.STACKTRACE, e);
} finally {
if(it != null) {
try {
it.close();
} catch (IOException e) {
classLogger.error(Constants.STACKTRACE, e);
}
}
}
return returnMap;
}
/**
*
* @return
*/
public Map getComplexSelectorsMap() {
Map returnMap = new HashMap<>();
String query = "select distinct "
+ "?header "
+ "?alias "
+ "?dataType "
+ "?qsInfo "
+ "?queryType "
+ "?queryJson "
+ "where {"
+ "{?header <" + QUERY_SELECTOR_COMPLEX_PRED + "> \"true\"^^xsd:boolean}"
+ "{?header <" + ALIAS_PRED + "> ?alias}"
+ "{?header <" + OWL.DATATYPEPROPERTY + "> ?datatype}"
+ "{?header <" + QUERY_STRUCT_PRED + "> ?qsInfo}"
+ "{?header <" + QUERY_SELECTOR_TYPE_PRED + "> ?queryType}"
+ "{?header <" + QUERY_SELECTOR_AS_STRING_PRED + "> ?queryJson}"
+ "{?header <" + QUERY_STRUCT_PRED + "> ?qsInfo}"
+ "}";
IRawSelectWrapper it = null;
try {
it = WrapperManager.getInstance().getRawWrapper(this.myEng, query);
while(it.hasNext()) {
Object[] row = it.next().getValues();
String header = (String) row[0];
String alias = (String) row[1];
String dataType = (String) row[2];
String qsInfo = (String) row[3];
String qType = (String) row[4];
String qJson = (String) row[5];
returnMap.put(header, new String[] {alias, dataType, qsInfo, qType, qJson});
}
} catch (Exception e) {
classLogger.error(Constants.STACKTRACE, e);
} finally {
if(it != null) {
try {
it.close();
} catch (IOException e) {
classLogger.error(Constants.STACKTRACE, e);
}
}
}
return returnMap;
}
/**
*
* @param uniqueName
* @return
*/
public String getOrderingAsString(String uniqueName) {
String parent = null;
if(uniqueName.contains("__")) {
parent = uniqueName.split("__")[0];
}
return getOrderingAsString(uniqueName, parent);
}
/**
*
* @param uniqueName
* @param parentUniqueName
* @return
*/
public String getOrderingAsString(String uniqueName, String parentUniqueName) {
// we have a property
String query = "select distinct ?header ?orderedLevels where {"
+ "bind(<" + SEMOSS_PROPERTY_PREFIX + "/" + uniqueName + "> as ?header)"
+ "{?header <" + RDF.TYPE + "> <" + SEMOSS_PROPERTY_PREFIX + ">}"
+ "bind(<" + SEMOSS_CONCEPT_PREFIX + "/" + parentUniqueName + "> as ?parent)"
+ "{?parent <" + RDFS.SUBCLASSOF + "> <" + SEMOSS_CONCEPT_PREFIX + ">}"
+ "{?parent <" + SEMOSS_PROPERTY_PREFIX + "> ?header}"
+ "{?header <" + ORDERING_PRED + "> ?orderedLevels}"
+ "}";
IRawSelectWrapper it = null;
try {
it = WrapperManager.getInstance().getRawWrapper(this.myEng, query);
while(it.hasNext()) {
Object[] row = it.next().getValues();
return row[1].toString();
}
} catch (Exception e) {
classLogger.error(Constants.STACKTRACE, e);
} finally {
if(it != null) {
try {
it.close();
} catch (IOException e) {
classLogger.error(Constants.STACKTRACE, e);
}
}
}
return null;
}
/**
*
* @return
*/
public Map getTableHeaderObjects() {
return getTableHeaderObjects(new String[0]);
}
/**
*
* @param dataTypes
* @return
*/
public Map getTableHeaderObjects(String[] dataTypes) {
// build filter for specific data types
StringBuilder filter = new StringBuilder();
if (dataTypes == null || dataTypes.length == 0) {
filter.append("optional{?header <").append(OWL.DATATYPEPROPERTY).append("> ?dt}");
} else {
filter.append("filter(");
for (int i = 0; i < dataTypes.length; i++) {
if (i != 0) {
filter.append(" || ");
}
if(dataTypes[i].toUpperCase().equals("NUMBER")) {
// we will do this for int / double
filter.append("?dt = \"")
.append(SemossDataType.INT.toString())
.append("\"")
.append(" || ")
.append("?dt = \"")
.append(SemossDataType.DOUBLE.toString())
.append("\"");
} else {
// clean data types to keep consistent
SemossDataType type = SemossDataType.convertStringToDataType(dataTypes[i]);
String cleanType = type.toString();
filter.append("?dt = \"")
.append(cleanType)
.append("\"");
if(type == SemossDataType.STRING) {
// add factor as well
filter.append(" || ");
filter.append("?dt = \"")
.append(SemossDataType.FACTOR.toString())
.append("\"");
}
}
}
filter.append(") {?header <").append(OWL.DATATYPEPROPERTY).append("> ?dt}");
}
String query = "select distinct "
+ "?header "
+ "(coalesce(?prim, 'false') as ?isPrim) "
+ "(coalesce(?dt, 'unknown') as ?dataType) "
+ "(coalesce(?adt, 'unknown') as ?adtlType) "
+ "(coalesce(?qs, 'unknown') as ?qsName) "
+ "(coalesce(?parent, 'none') as ?parentNode) "
+ "(coalesce(?display, 'none') as ?alias) "
+ "(coalesce(lcase(?display), 'none') as ?loweralias) "
+ "(coalesce(?derived, 'false') as ?isDerived) "
+ "where {"
+ "{"
+ "{?header <" + RDFS.SUBCLASSOF + "> <" + SEMOSS_CONCEPT_PREFIX + ">}"
+ filter.toString()
+ "optional{?header <" + ADDTL_DATATYPE_PRED + "> ?adt}"
+ "optional{?header <" + QUERY_STRUCT_PRED + "> ?qs}"
+ "optional{?header <" + IS_PRIM_KEY_PRED + "> ?prim}"
+ "optional{?header <" + ALIAS_PRED + "> ?display}"
+ "optional{?header <" + IS_DERIVED_PRED + "> ?derived}"
+ "bind('none' as ?parent)"
+ "}"
+ "union"
+ "{"
+ "{?header <" + RDF.TYPE + "> <" + SEMOSS_PROPERTY_PREFIX + ">}"
+ "{?parent <" + SEMOSS_PROPERTY_PREFIX + "> ?header}"
+ filter.toString()
+ "optional{?header <" + ADDTL_DATATYPE_PRED + "> ?adt}"
+ "optional{?header <" + QUERY_STRUCT_PRED + "> ?qs}"
+ "optional{?header <" + IS_PRIM_KEY_PRED + "> ?prim}"
+ "optional{?header <" + ALIAS_PRED + "> ?display}"
+ "optional{?header <" + IS_DERIVED_PRED + "> ?derived}"
+ "}"
+ "filter(?header != <" + SEMOSS_CONCEPT_PREFIX + "> && "
+ "?header != <" + SEMOSS_PROPERTY_PREFIX + ">)"
+ "} ORDER BY ?loweralias";
Map nameToIndex = new HashMap();
List
© 2015 - 2025 Weber Informatics LLC | Privacy Policy