blob: 91cb74e67a0c3485b38a2b7ef432f011821b1a0d [file] [log] [blame]
package org.apache.rya.api;
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.rya.api.RdfCloudTripleStoreConstants.TABLE_LAYOUT;
import org.apache.rya.api.layout.TableLayoutStrategy;
import org.apache.rya.api.layout.TablePrefixLayoutStrategy;
import org.eclipse.rdf4j.model.IRI;
import org.eclipse.rdf4j.model.Literal;
import org.eclipse.rdf4j.model.Value;
import org.eclipse.rdf4j.model.ValueFactory;
import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
public class RdfCloudTripleStoreUtils {
public static final ValueFactory VF = SimpleValueFactory.getInstance();
public static final Pattern literalPattern = Pattern.compile("^\"(.*?)\"((\\^\\^<(.+?)>)$|(@(.{2}))$)");
// public static byte[] writeValue(Value value) throws IOException {
// return RdfIO.writeValue(value);
//// if (value == null)
//// return new byte[]{};
//// ByteArrayDataOutput dataOut = ByteStreams.newDataOutput();
//// if (value instanceof IRI) {
//// dataOut.writeByte(RdfCloudTripleStoreConstants.URI_MARKER);
//// writeString(((IRI) value).toString(), dataOut);
//// } else if (value instanceof BNode) {
//// dataOut.writeByte(RdfCloudTripleStoreConstants.BNODE_MARKER);
//// writeString(((BNode) value).getID(), dataOut);
//// } else if (value instanceof Literal) {
//// Literal lit = (Literal) value;
////
//// String label = lit.getLabel();
//// String language = lit.getLanguage();
//// IRI datatype = lit.getDatatype();
////
//// if (datatype != null) {
//// dataOut.writeByte(RdfCloudTripleStoreConstants.DATATYPE_LITERAL_MARKER);
//// writeString(label, dataOut);
//// dataOut.write(writeValue(datatype));
//// } else if (language != null) {
//// dataOut.writeByte(RdfCloudTripleStoreConstants.LANG_LITERAL_MARKER);
//// writeString(label, dataOut);
//// writeString(language, dataOut);
//// } else {
//// dataOut.writeByte(RdfCloudTripleStoreConstants.PLAIN_LITERAL_MARKER);
//// writeString(label, dataOut);
//// }
//// } else {
//// throw new IllegalArgumentException("unexpected value type: "
//// + value.getClass());
//// }
//// return dataOut.toByteArray();
// }
// public static Value readValue(ByteArrayDataInput dataIn, ValueFactory vf)
// throws IOException, ClassCastException {
// return RdfIO.readValue(dataIn, vf, DELIM_BYTE);
//// int valueTypeMarker;
//// try {
//// valueTypeMarker = dataIn.readByte();
//// } catch (Exception e) {
//// return null;
//// }
////
//// Value ret = null;
//// if (valueTypeMarker == RdfCloudTripleStoreConstants.URI_MARKER) {
//// String uriString = readString(dataIn);
//// ret = vf.createIRI(uriString);
//// } else if (valueTypeMarker == RdfCloudTripleStoreConstants.BNODE_MARKER) {
//// String bnodeID = readString(dataIn);
//// ret = vf.createBNode(bnodeID);
//// } else if (valueTypeMarker == RdfCloudTripleStoreConstants.PLAIN_LITERAL_MARKER) {
//// String label = readString(dataIn);
//// ret = vf.createLiteral(label);
//// } else if (valueTypeMarker == RdfCloudTripleStoreConstants.LANG_LITERAL_MARKER) {
//// String label = readString(dataIn);
//// String language = readString(dataIn);
//// ret = vf.createLiteral(label, language);
//// } else if (valueTypeMarker == RdfCloudTripleStoreConstants.DATATYPE_LITERAL_MARKER) {
//// String label = readString(dataIn);
//// IRI datatype = (IRI) readValue(dataIn, vf);
//// ret = vf.createLiteral(label, datatype);
//// } else {
//// throw new InvalidValueTypeMarkerRuntimeException(valueTypeMarker, "Invalid value type marker: "
//// + valueTypeMarker);
//// }
////
//// return ret;
// }
// public static void writeString(String s, ByteArrayDataOutput dataOut)
// throws IOException {
// dataOut.writeUTF(s);
// }
//
// public static String readString(ByteArrayDataInput dataIn)
// throws IOException {
// return dataIn.readUTF();
// }
//
// public static byte[] writeContexts(Resource... contexts) throws IOException {
// if (contexts != null) {
// ByteArrayDataOutput cntxout = ByteStreams.newDataOutput();
// for (Resource resource : contexts) {
// final byte[] context_bytes = RdfCloudTripleStoreUtils
// .writeValue(resource);
// cntxout.write(context_bytes);
// cntxout.write(RdfCloudTripleStoreConstants.DELIM_BYTES);
// }
// return cntxout.toByteArray();
// } else
// return new byte[]{};
// }
//
// public static List<Resource> readContexts(byte[] cont_arr, ValueFactory vf)
// throws IOException {
// List<Resource> contexts = new ArrayList<Resource>();
// String conts_str = new String(cont_arr);
// String[] split = conts_str.split(RdfCloudTripleStoreConstants.DELIM);
// for (String string : split) {
// contexts.add((Resource) RdfCloudTripleStoreUtils.readValue(ByteStreams
// .newDataInput(string.getBytes()), vf));
// }
// return contexts;
// }
// public static Statement translateStatementFromRow(ByteArrayDataInput input, Text context, TABLE_LAYOUT tble, ValueFactory vf) throws IOException {
// Resource subject;
// IRI predicate;
// Value object;
// if (TABLE_LAYOUT.SPO.equals(tble)) {
// subject = (Resource) RdfCloudTripleStoreUtils.readValue(input, vf);
// predicate = (IRI) RdfCloudTripleStoreUtils.readValue(input, vf);
// object = RdfCloudTripleStoreUtils.readValue(input, vf);
// } else if (TABLE_LAYOUT.OSP.equals(tble)) {
// object = RdfCloudTripleStoreUtils.readValue(input, vf);
// subject = (Resource) RdfCloudTripleStoreUtils.readValue(input, vf);
// predicate = (IRI) RdfCloudTripleStoreUtils.readValue(input, vf);
// } else if (TABLE_LAYOUT.PO.equals(tble)) {
// predicate = (IRI) RdfCloudTripleStoreUtils.readValue(input, vf);
// object = RdfCloudTripleStoreUtils.readValue(input, vf);
// subject = (Resource) RdfCloudTripleStoreUtils.readValue(input, vf);
// } else {
// throw new IllegalArgumentException("Table[" + tble + "] is not valid");
// }
// if (context == null || INFO_TXT.equals(context))
// return vf.createStatement(subject, predicate, object); //default graph
// else
// return vf.createStatement(subject, predicate, object, (Resource) readValue(ByteStreams.newDataInput(context.getBytes()), vf)); //TODO: Seems like a perf hog
// }
// public static byte[] buildRowWith(byte[] bytes_one, byte[] bytes_two, byte[] bytes_three) throws IOException {
// ByteArrayDataOutput rowidout = ByteStreams.newDataOutput();
// rowidout.write(bytes_one);
// rowidout.writeByte(DELIM_BYTE);
//// rowidout.write(RdfCloudTripleStoreConstants.DELIM_BYTES);
// rowidout.write(bytes_two);
// rowidout.writeByte(DELIM_BYTE);
//// rowidout.write(RdfCloudTripleStoreConstants.DELIM_BYTES);
// rowidout.write(bytes_three);
// return truncateRowId(rowidout.toByteArray());
// }
// public static byte[] truncateRowId(byte[] byteArray) {
// if (byteArray.length > 32000) {
// ByteArrayDataOutput stream = ByteStreams.newDataOutput();
// stream.write(byteArray, 0, 32000);
// return stream.toByteArray();
// }
// return byteArray;
// }
public static class CustomEntry<T, U> implements Map.Entry<T, U> {
private T key;
private U value;
public CustomEntry(T key, U value) {
this.key = key;
this.value = value;
}
@Override
public T getKey() {
return key;
}
@Override
public U getValue() {
return value;
}
public T setKey(T key) {
this.key = key;
return this.key;
}
@Override
public U setValue(U value) {
this.value = value;
return this.value;
}
@Override
public String toString() {
return "CustomEntry{" +
"key=" + key +
", value=" + value +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
CustomEntry that = (CustomEntry) o;
if (key != null ? !key.equals(that.key) : that.key != null) return false;
return value != null ? value.equals(that.value) : that.value == null;
}
@Override
public int hashCode() {
int result = key != null ? key.hashCode() : 0;
result = 31 * result + (value != null ? value.hashCode() : 0);
return result;
}
}
/**
* If value is a IRI, then return as IRI, otherwise return namespace/value as the IRI
*
* @param namespace
* @param value
* @return
*/
public static IRI convertToUri(String namespace, String value) {
if (value == null)
return null;
IRI subjUri;
try {
subjUri = VF.createIRI(value);
} catch (Exception e) {
//not uri
if (namespace == null)
return null;
subjUri = VF.createIRI(namespace, value);
}
return subjUri;
}
public static Literal convertToDataTypeLiteral(String s) {
int i = s.indexOf("^^");
if (i != -1) {
String val = s.substring(1, i - 1);
int dt_i_start = i + 2;
int dt_i_end = s.length();
if (s.charAt(dt_i_start) == '<') {
dt_i_start = dt_i_start + 1;
dt_i_end = dt_i_end - 1;
}
String dataType = s.substring(dt_i_start, dt_i_end);
return VF.createLiteral(val, VF.createIRI(dataType));
}
return null;
}
public static boolean isDataTypeLiteral(String lit) {
return lit != null && lit.indexOf("^^") != -1;
}
public static boolean isUri(String uri) {
if (uri == null) return false;
try {
VF.createIRI(uri);
} catch (Exception e) {
return false;
}
return true;
}
// public static boolean isQueryTimeBased(Configuration conf) {
// return (conf != null && conf.getBoolean(RdfCloudTripleStoreConfiguration.CONF_ISQUERYTIMEBASED, false));
// }
//
// public static void setQueryTimeBased(Configuration conf, boolean timeBased) {
// if (conf != null)
// conf.setBoolean(RdfCloudTripleStoreConfiguration.CONF_ISQUERYTIMEBASED, isQueryTimeBased(conf) || timeBased);
// }
// public static void addTimeIndexUri(Configuration conf, IRI timeUri, Class<? extends TtlValueConverter> ttlValueConvClass) {
// String[] timeIndexUris = conf.getStrings(RdfCloudTripleStoreConfiguration.CONF_TIMEINDEXURIS);
// if (timeIndexUris == null)
// timeIndexUris = new String[0];
// List<String> stringList = new ArrayList<String>(Arrays.asList(timeIndexUris));
// String timeUri_s = timeUri.stringValue();
// if (!stringList.contains(timeUri_s))
// stringList.add(timeUri_s);
// conf.setStrings(RdfCloudTripleStoreConfiguration.CONF_TIMEINDEXURIS, stringList.toArray(new String[stringList.size()]));
// conf.set(timeUri_s, ttlValueConvClass.getName());
// }
// public static Class<? extends TtlValueConverter> getTtlValueConverter(Configuration conf, IRI predicate) throws ClassNotFoundException {
// if (predicate == null)
// return null;
//
// String[] s = conf.getStrings(RdfCloudTripleStoreConfiguration.CONF_TIMEINDEXURIS);
// if (s == null)
// return null;
//
// for (String uri : s) {
// if (predicate.stringValue().equals(uri)) {
// return (Class<? extends TtlValueConverter>) RdfCloudTripleStoreUtils.class.getClassLoader().loadClass(conf.get(uri));
// }
// }
// return null;
// }
public static String layoutToTable(TABLE_LAYOUT layout, RdfCloudTripleStoreConfiguration conf) {
TableLayoutStrategy tableLayoutStrategy = conf.getTableLayoutStrategy();
return layoutToTable(layout, tableLayoutStrategy);
}
public static String layoutToTable(TABLE_LAYOUT layout, TableLayoutStrategy tableLayoutStrategy) {
if (tableLayoutStrategy == null) {
tableLayoutStrategy = new TablePrefixLayoutStrategy();
}
switch (layout) {
case SPO: {
return tableLayoutStrategy.getSpo();
}
case PO: {
return tableLayoutStrategy.getPo();
}
case OSP: {
return tableLayoutStrategy.getOsp();
}
}
return null;
}
public static String layoutPrefixToTable(TABLE_LAYOUT layout, String prefix) {
return layoutToTable(layout, new TablePrefixLayoutStrategy(prefix));
}
//helper methods to createValue
public static Value createValue(String resource) {
if (isBNode(resource))
return VF.createBNode(resource.substring(2));
Literal literal;
if ((literal = makeLiteral(resource)) != null)
return literal;
if (resource.contains(":") || resource.contains("/") || resource.contains("#")) {
return VF.createIRI(resource);
} else {
throw new RuntimeException((new StringBuilder()).append(resource).append(" is not a valid URI, blank node, or literal value").toString());
}
}
public static boolean isBNode(String resource) {
return resource.length() > 2 && resource.startsWith("_:");
}
public static boolean isLiteral(String resource) {
return literalPattern.matcher(resource).matches() || resource.startsWith("\"") && resource.endsWith("\"") && resource.length() > 1;
}
public static boolean isURI(String resource) {
return !isBNode(resource) && !isLiteral(resource) && (resource.contains(":") || resource.contains("/") || resource.contains("#"));
}
public static Literal makeLiteral(String resource) {
Matcher matcher = literalPattern.matcher(resource);
if (matcher.matches())
if (null != matcher.group(4))
return VF.createLiteral(matcher.group(1), VF.createIRI(matcher.group(4)));
else
return VF.createLiteral(matcher.group(1), matcher.group(6));
if (resource.startsWith("\"") && resource.endsWith("\"") && resource.length() > 1)
return VF.createLiteral(resource.substring(1, resource.length() - 1));
else
return null;
}
}