
prerna.reactor.database.metaeditor.GetOwlDictionaryReactor Maven / Gradle / Ivy
The newest version!
package prerna.reactor.database.metaeditor;
import java.io.IOException;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Vector;
import org.apache.jena.vocabulary.OWL;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.openrdf.model.vocabulary.RDFS;
import org.semarglproject.vocab.RDF;
import prerna.engine.api.IDatabaseEngine;
import prerna.engine.api.IHeadersDataRow;
import prerna.engine.api.IRawSelectWrapper;
import prerna.sablecc2.om.PixelDataType;
import prerna.sablecc2.om.PixelOperationType;
import prerna.sablecc2.om.ReactorKeysEnum;
import prerna.sablecc2.om.nounmeta.NounMetadata;
import prerna.util.Constants;
import prerna.util.Utility;
public class GetOwlDictionaryReactor extends AbstractMetaEditorReactor {
private static final Logger classLogger = LogManager.getLogger(GetOwlDictionaryReactor.class);
public GetOwlDictionaryReactor() {
this.keysToGet = new String[]{ReactorKeysEnum.DATABASE.getKey()};
}
@Override
public NounMetadata execute() {
organizeKeys();
String databaseId = this.keyValue.get(this.keysToGet[0]);
// we may have an alias
databaseId = testDatabaseId(databaseId, false);
// we have some ordering requirements
// so can't just flush these results straight to the FE
IDatabaseEngine database = Utility.getDatabase(databaseId);
String query = "SELECT DISTINCT "
+ "?URI "
+ "(COALESCE(?DESCRIPTION, '') AS ?desc) "
+ "(COALESCE(?LOGICAL_NAME, '') AS ?logical) "
+ "(COALESCE(?TYPE, 'STRING') AS ?type) "
+ "WHERE {"
+ "{"
+ "{?URI <" + RDFS.SUBCLASSOF + "> } "
+ "OPTIONAL{?URI <" + RDFS.COMMENT.toString() + "> ?DESCRIPTION} "
+ "OPTIONAL{?URI <" + OWL.sameAs.toString() + "> ?LOGICAL_NAME} "
+ "OPTIONAL{?URI <" + RDFS.CLASS.toString() + "> ?TYPE} "
+ "Filter(?URI != )"
// currently not returning the table names in RDBMS/R/etc. data source structures
+ "MINUS{?URI <" + RDFS.DOMAIN.toString() + "> \"noData\" }"
+ "}"
+ "UNION "
+ "{"
+ "{?URI <" + RDF.TYPE + "> } "
+ "OPTIONAL{?URI <" + RDFS.COMMENT.toString() + "> ?DESCRIPTION} "
+ "OPTIONAL{?URI <" + OWL.sameAs.toString() + "> ?LOGICAL_NAME} "
+ "OPTIONAL{?URI <" + RDFS.CLASS.toString() + "> ?TYPE} "
+ "}"
+ "} ORDER BY ?CONCEPT ?LOGICAL_NAME";
Map> results = new HashMap>();
IRawSelectWrapper wrapper = null;
try {
wrapper = database.getOWLEngineFactory().getReadOWL().query(query);
while(wrapper.hasNext()) {
IHeadersDataRow row = wrapper.next();
Object[] raw = row.getRawValues();
Object[] clean = row.getValues();
String uri = raw[0].toString();
String tableName = Utility.getInstanceName(uri);
String columnName = Utility.getClassName(uri);
// get the other values
String description = clean[1].toString();
String logical = clean[2].toString();
String type = clean[3].toString();
if(results.containsKey(uri)) {
// table, column, primkey, dataType will not change
// just appending to the description and logical names
Map record = results.get(uri);
List descArr = (List) record.get("description");
if(description != null && !description.isEmpty() && !descArr.contains(description)) {
descArr.add(description);
}
List logicalArr = (List) record.get("logical");
if(logical != null && !logical.isEmpty() && !logicalArr.contains(logical)) {
logicalArr.add(logical);
}
} else {
Map record = new HashMap();
record.put("table", tableName);
record.put("column", columnName);
if(uri.startsWith("http://semoss.org/ontologies/Concept")) {
record.put("isPrimKey", true);
} else {
record.put("isPrimKey", false);
}
record.put("dataType", type.replace("TYPE:", ""));
List descArr = new Vector();
if(description != null && !description.isEmpty()) {
descArr.add(description);
}
record.put("description", descArr);
List logicalArr = new Vector();
if(logical != null && !logical.isEmpty()) {
logicalArr.add(logical);
}
record.put("logical", logicalArr);
// store
results.put(uri, record);
}
}
} catch (Exception e) {
classLogger.error(Constants.STACKTRACE, e);
} finally {
if(wrapper != null) {
try {
wrapper.close();
} catch (IOException e) {
classLogger.error(Constants.STACKTRACE, e);
}
}
}
// need to order the information
List
© 2015 - 2025 Weber Informatics LLC | Privacy Policy