/*
* Copyright 2013, TopicQuests
*
* Licensed 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.
*/
package org.topicquests.topicmap.json.model;
import java.util.*;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
//import org.json.simple.JSONObject;
//import org.json.simple.parser.JSONParser;
import org.topicquests.common.ResultPojo;
import org.topicquests.common.api.IResult;
import org.topicquests.common.api.ITopicQuestsOntology;
import org.topicquests.model.api.ITicket;
import org.topicquests.model.api.node.INode;
import org.topicquests.model.api.node.ITuple;
import org.topicquests.model.api.query.ITupleQuery;
import org.topicquests.persist.json.api.IJSONDocStoreModel;
import org.topicquests.topicmap.json.model.api.IJSONTopicDataProvider;
import org.topicquests.topicmap.json.model.api.IJSONTopicMapOntology;
import org.topicquests.util.LoggingPlatform;
import org.topicquests.model.Node;
import net.minidev.json.JSONObject;
import net.minidev.json.parser.JSONParser;
/**
* @author park
*
*/
public class TupleQuery implements ITupleQuery {
private LoggingPlatform log = LoggingPlatform.getLiveInstance();
private IJSONTopicDataProvider database;
private IJSONDocStoreModel jsonModel;
private CredentialUtility credentialUtil;
// private JSONParser parser;
private final String
//defined in jsonblobstore-props.xml
TOPIC_INDEX = IJSONTopicMapOntology.TOPIC_INDEX,
CORE_TYPE = IJSONTopicMapOntology.CORE_TYPE;
/**
*
*/
public TupleQuery(IJSONTopicDataProvider d, IJSONDocStoreModel j) {
database = d;
jsonModel = j;
// parser = new JSONParser();
credentialUtil = new CredentialUtility(database,jsonModel);
}
/* (non-Javadoc)
* @see org.topicquests.model.api.ITupleQuery#listObjectNodesByRelationAndObjectRole(java.lang.String, java.lang.String, int, int, java.util.Set)
*/
@Override
public IResult listObjectNodesByRelationAndObjectRole(String relationLocator, String objectRoleLocator, int start, int count, ITicket credentials) {
BoolQueryBuilder qba = QueryBuilders.boolQuery();
QueryBuilder qb1 = QueryBuilders.termQuery(ITopicQuestsOntology.INSTANCE_OF_PROPERTY_TYPE, relationLocator);
QueryBuilder qb2 = QueryBuilders.termQuery(ITopicQuestsOntology.TUPLE_OBJECT_ROLE_PROPERTY, objectRoleLocator);
qba.must(qb1);
qba.must(qb2);
log.logDebug("TupleQuery.listObjectNodesByRelationAndObjectRole- "+qba.toString());
IResult result = this.pluckNodes(qba, ITopicQuestsOntology.TUPLE_SUBJECT_PROPERTY, start, credentials, count);
return result;
}
/* (non-Javadoc)
* @see org.topicquests.model.api.ITupleQuery#listObjectNodesByRelationAndSubjectRole(java.lang.String, java.lang.String, int, int, java.util.Set)
*/
@Override
public IResult listObjectNodesByRelationAndSubjectRole(String relationLocator, String subjectRoleLocator, int start, int count, ITicket credentials) {
BoolQueryBuilder qba = QueryBuilders.boolQuery();
QueryBuilder qb1 = QueryBuilders.termQuery(ITopicQuestsOntology.INSTANCE_OF_PROPERTY_TYPE, relationLocator);
QueryBuilder qb2 = QueryBuilders.termQuery(ITopicQuestsOntology.TUPLE_SUBJECT_ROLE_PROPERTY, subjectRoleLocator);
qba.must(qb1);
qba.must(qb2);
log.logDebug("TupleQuery.listObjectNodesByRelationAndSubjectRole- "+qba.toString());
IResult result = this.pluckNodes(qba, ITopicQuestsOntology.TUPLE_SUBJECT_PROPERTY, start, credentials, count);
return result;
}
/* (non-Javadoc)
* @see org.topicquests.model.api.ITupleQuery#listObjectNodesBySubjectAndRelation(java.lang.String, java.lang.String, int, int, java.util.Set)
*/
@Override
public IResult listObjectNodesBySubjectAndRelation(String subjectLocator, String relationLocator, int start, int count, ITicket credentials) {
BoolQueryBuilder qba = QueryBuilders.boolQuery();
QueryBuilder qb1 = QueryBuilders.termQuery(ITopicQuestsOntology.INSTANCE_OF_PROPERTY_TYPE, relationLocator);
QueryBuilder qb2 = QueryBuilders.termQuery(ITopicQuestsOntology.TUPLE_SUBJECT_PROPERTY, subjectLocator);
qba.must(qb1);
qba.must(qb2);
log.logDebug("TupleQuery.listObjectNodesBySubjectAndRelation- "+qba.toString());
IResult result = this.pluckNodes(qba, ITopicQuestsOntology.TUPLE_SUBJECT_PROPERTY, start, credentials, count);
return result;
}
/* (non-Javadoc)
* @see org.topicquests.model.api.ITupleQuery#listObjectNodesBySubjectAndRelationAndScope(java.lang.String, java.lang.String, java.lang.String, int, int, java.util.Set)
*/
@Override
public IResult listObjectNodesBySubjectAndRelationAndScope(String subjectLocator, String relationLocator, String scopeLocator, int start, int count, ITicket credentials) {
BoolQueryBuilder qba = QueryBuilders.boolQuery();
QueryBuilder qb1 = QueryBuilders.termQuery(ITopicQuestsOntology.INSTANCE_OF_PROPERTY_TYPE, relationLocator);
QueryBuilder qb2 = QueryBuilders.termQuery(ITopicQuestsOntology.TUPLE_SUBJECT_PROPERTY, subjectLocator);
QueryBuilder qb3 = QueryBuilders.termQuery(ITopicQuestsOntology.SCOPE_LIST_PROPERTY_TYPE, scopeLocator);
qba.must(qb1);
qba.must(qb2);
qba.must(qb3);
log.logDebug("TupleQuery.listObjectNodesBySubjectAndRelationAndScope- "+qba.toString());
IResult result = this.pluckNodes(qba, ITopicQuestsOntology.TUPLE_OBJECT_PROPERTY, start, credentials, count);
return result;
}
/* (non-Javadoc)
* @see org.topicquests.model.api.ITupleQuery#listSubjectNodesByObjectAndRelation(java.lang.String, java.lang.String, int, int, java.util.Set)
*/
@Override
public IResult listSubjectNodesByObjectAndRelation(String objectLocator, String relationLocator, int start, int count, ITicket credentials) {
BoolQueryBuilder qba = QueryBuilders.boolQuery();
QueryBuilder qb1 = QueryBuilders.termQuery(ITopicQuestsOntology.INSTANCE_OF_PROPERTY_TYPE, relationLocator);
QueryBuilder qb2 = QueryBuilders.termQuery(ITopicQuestsOntology.TUPLE_OBJECT_PROPERTY, objectLocator);
qba.must(qb1);
qba.must(qb2);
log.logDebug("TupleQuery.listSubjectNodesByObjectAndRelation- "+qba.toString());
IResult result = this.pluckNodes(qba, ITopicQuestsOntology.TUPLE_SUBJECT_PROPERTY, start, credentials, count);
return result;
}
/* (non-Javadoc)
* @see org.topicquests.model.api.ITupleQuery#listSubjectNodesByObjectAndRelationAndScope(java.lang.String, java.lang.String, java.lang.String, int, int, java.util.Set)
*/
@Override
public IResult listSubjectNodesByObjectAndRelationAndScope(String objectLocator, String relationLocator, String scopeLocator, int start, int count, ITicket credentials) {
BoolQueryBuilder qba = QueryBuilders.boolQuery();
QueryBuilder qb1 = QueryBuilders.termQuery(ITopicQuestsOntology.INSTANCE_OF_PROPERTY_TYPE, relationLocator);
QueryBuilder qb2 = QueryBuilders.termQuery(ITopicQuestsOntology.TUPLE_OBJECT_PROPERTY, objectLocator);
QueryBuilder qb3 = QueryBuilders.termQuery(ITopicQuestsOntology.SCOPE_LIST_PROPERTY_TYPE, scopeLocator);
qba.must(qb1);
qba.must(qb2);
qba.must(qb3);
log.logDebug("TupleQuery.listSubjectNodesByObjectAndRelationAndScope- "+qba.toString());
IResult result = this.pluckNodes(qba, ITopicQuestsOntology.TUPLE_SUBJECT_PROPERTY, start, credentials, count);
return result;
}
/* (non-Javadoc)
* @see org.topicquests.model.api.ITupleQuery#listSubjectNodesByRelationAndObjectRole(java.lang.String, java.lang.String, int, int, java.util.Set)
*/
@Override
public IResult listSubjectNodesByRelationAndObjectRole(String relationLocator, String objectRoleLocator, int start, int count, ITicket credentials) {
BoolQueryBuilder qba = QueryBuilders.boolQuery();
QueryBuilder qb1 = QueryBuilders.termQuery(ITopicQuestsOntology.INSTANCE_OF_PROPERTY_TYPE, relationLocator);
QueryBuilder qb2 = QueryBuilders.termQuery(ITopicQuestsOntology.TUPLE_OBJECT_ROLE_PROPERTY, objectRoleLocator);
qba.must(qb1);
qba.must(qb2);
log.logDebug("TupleQuery.listSubjectNodesByRelationAndObjectRole- "+qba.toString());
IResult result = this.pluckNodes(qba, ITopicQuestsOntology.TUPLE_SUBJECT_PROPERTY, start, credentials, count);
return result;
}
/* (non-Javadoc)
* @see org.topicquests.model.api.ITupleQuery#listSubjectNodesByRelationAndSubjectRole(java.lang.String, java.lang.String, int, int, java.util.Set)
*/
@Override
public IResult listSubjectNodesByRelationAndSubjectRole(String relationLocator, String subjectRoleLocator, int start, int count, ITicket credentials) {
BoolQueryBuilder qba = QueryBuilders.boolQuery();
QueryBuilder qb1 = QueryBuilders.termQuery(ITopicQuestsOntology.INSTANCE_OF_PROPERTY_TYPE, relationLocator);
QueryBuilder qb2 = QueryBuilders.termQuery(ITopicQuestsOntology.TUPLE_SUBJECT_ROLE_PROPERTY, subjectRoleLocator);
qba.must(qb1);
qba.must(qb2);
log.logDebug("TupleQuery.listSubjectNodesByRelationAndSubjectRole- "+qba.toString());
IResult result = this.pluckNodes(qba, ITopicQuestsOntology.TUPLE_SUBJECT_PROPERTY, start, credentials, count);
return result;
}
/* (non-Javadoc)
* @see org.topicquests.model.api.ITupleQuery#listTuplesByObjectLocator(java.lang.String, int, int, java.util.Set)
*/
@Override
public IResult listTuplesByObjectLocator(String objectLocator, int start, int count,
ITicket credentials) {
IResult result = jsonModel.listDocumentsByProperty(TOPIC_INDEX, ITopicQuestsOntology.TUPLE_OBJECT_PROPERTY,
objectLocator, start, count, CORE_TYPE);
if (result.getResultObject() != null) {
List<String>docs = (List<String>)result.getResultObject();
String json;
Iterator<String>itr = docs.iterator();
List<INode>nl = new ArrayList<INode>();
result.setResultObject(nl);
INode n;
JSONObject jo;
try {
while(itr.hasNext()) {
json = itr.next();
jo = jsonToJSON(json);
if (credentialUtil.checkCredentials(jo,credentials))
nl.add(new Node(jo));
}
} catch (Exception e) {
log.logError(e.getMessage(), e);
result.addErrorString(e.getMessage());
}
}
return result;
}
/* (non-Javadoc)
* @see org.topicquests.model.api.ITupleQuery#listTuplesByPredTypeAndObject(java.lang.String, java.lang.String, int, int, java.util.Set)
*/
@Override
public IResult listTuplesByPredTypeAndObject(String predType, String obj, int start, int count, ITicket credentials) {
BoolQueryBuilder qba = QueryBuilders.boolQuery();
QueryBuilder qb1 = QueryBuilders.termQuery(ITopicQuestsOntology.INSTANCE_OF_PROPERTY_TYPE, predType);
QueryBuilder qb2 = QueryBuilders.termQuery(ITopicQuestsOntology.TUPLE_OBJECT_PROPERTY, obj);
qba.must(qb1);
qba.must(qb2);
log.logDebug("TupleQuery.listTuplesByPredTypeAndObject- "+qba.toString());
IResult result = jsonModel.runQuery(TOPIC_INDEX, qba, 0, -1, CORE_TYPE);
if (result.getResultObject() != null) {
result.setResultObject(null);
List<String>docs = (List<String>)result.getResultObject();
if (docs != null && !docs.isEmpty()) {
List<ITuple>tups = new ArrayList<ITuple>();
result.setResultObject(tups);
String json;
ITuple n;
JSONObject jo;
Iterator<String>itr = docs.iterator();
try {
while(itr.hasNext()) {
json = itr.next();
jo = jsonToJSON(json);
if (credentialUtil.checkCredentials(jo,credentials))
tups.add((ITuple)new Node(jo));
}
} catch (Exception e) {
log.logError(e.getMessage(), e);
result.addErrorString(e.getMessage());
}
}
}
return result;
}
/**
* Pluck objects from a list of tuples
* @param qb
* @param type subject or object
* @param start TODO
* @param credentials
* @param count TODO
* @return <code>null</code> or <code>List<INode></code>
*/
private IResult pluckNodes(QueryBuilder qb, String type, int start, ITicket credentials, int count) {
IResult result = jsonModel.runQuery(TOPIC_INDEX, qb, 0, -1, CORE_TYPE);
if (result.getResultObject() != null) {
result.setResultObject(null);
List<String>tupleDocs = (List<String>)result.getResultObject();
try {
if (tupleDocs != null && !tupleDocs.isEmpty()) {
String json;
Iterator<String>itr = tupleDocs.iterator();
List<INode>nl = new ArrayList<INode>();
result.setResultObject(nl);
INode n;
JSONObject jo;
IResult r;
while(itr.hasNext()) {
json = itr.next();
jo = jsonToJSON(json);
r = database.getNode((String)jo.get(type), credentials);
if (r.hasError())
result.addErrorString(r.getErrorString());
if (r.getResultObject() != null)
nl.add((INode)r.getResultObject());
}
}
} catch (Exception e) {
log.logError(e.getMessage(),e);
result.addErrorString(e.getMessage());
}
}
return result;
}
/* (non-Javadoc)
* @see org.topicquests.model.api.ITupleQuery#listTuplesBySubject(java.lang.String, int, int, java.util.Set)
*/
@Override
public IResult listTuplesBySubject(String subjectLocator, int start, int count,
ITicket credentials) {
//listDocumentsByProperty(String index, String key, String value, int start, int count, String... types)
IResult result = jsonModel.listDocumentsByProperty(TOPIC_INDEX, ITopicQuestsOntology.TUPLE_SUBJECT_PROPERTY,
subjectLocator, start, count, CORE_TYPE);
if (result.getResultObject() != null) {
List<String>docs = (List<String>)result.getResultObject();
String json;
Iterator<String>itr = docs.iterator();
List<INode>nl = new ArrayList<INode>();
result.setResultObject(nl);
INode n;
JSONObject jo;
try {
while(itr.hasNext()) {
json = itr.next();
jo = jsonToJSON(json);
if (credentialUtil.checkCredentials(jo,credentials))
nl.add(new Node(jo));
}
} catch (Exception e) {
log.logError(e.getMessage(), e);
result.addErrorString(e.getMessage());
}
}
return result;
}
/* (non-Javadoc)
* @see org.topicquests.model.api.ITupleQuery#listTuplesBySubjectAndPredType(java.lang.String, java.lang.String, int, int, java.util.Set)
*/
@Override
public IResult listTuplesBySubjectAndPredType(String subjectLocator, String predType, int start, int count, ITicket credentials) {
BoolQueryBuilder qba = QueryBuilders.boolQuery();
QueryBuilder qb1 = QueryBuilders.termQuery(ITopicQuestsOntology.INSTANCE_OF_PROPERTY_TYPE, predType);
QueryBuilder qb2 = QueryBuilders.termQuery(ITopicQuestsOntology.TUPLE_SUBJECT_PROPERTY, subjectLocator);
qba.must(qb1);
qba.must(qb2);
log.logDebug("TupleQuery.listTuplesBySubjectAndPredType- "+qba.toString());
IResult result = jsonModel.runQuery(TOPIC_INDEX, qba, 0, -1, CORE_TYPE);
if (result.getResultObject() != null) {
result.setResultObject(null);
List<String>docs = (List<String>)result.getResultObject();
if (docs != null && !docs.isEmpty()) {
List<ITuple>tups = new ArrayList<ITuple>();
result.setResultObject(tups);
String json;
ITuple n;
JSONObject jo;
Iterator<String>itr = docs.iterator();
try {
while(itr.hasNext()) {
json = itr.next();
jo = jsonToJSON(json);
if (credentialUtil.checkCredentials(jo,credentials))
tups.add((ITuple)new Node(jo));
}
} catch (Exception e) {
log.logError(e.getMessage(), e);
result.addErrorString(e.getMessage());
}
}
}
return result;
}
private JSONObject jsonToJSON(String json) throws Exception {
return (JSONObject)new JSONParser(JSONParser.MODE_JSON_SIMPLE).parse(json);
}
@Override
public IResult listTuplesByLabel(String [] labels, int start, int count, ITicket credentials) {
IResult result = new ResultPojo();
BoolQueryBuilder qba =null;
QueryBuilder qb1 = null;
QueryBuilder qb2 =null;
ITuple t;
IResult r;
Set<String> subresult = new HashSet<String> ();
for (String lax: labels) {
qba = QueryBuilders.boolQuery();
qb1 = QueryBuilders.termQuery(ITopicQuestsOntology.LABEL_PROPERTY, lax);
qb2 = QueryBuilders.wildcardQuery(ITopicQuestsOntology.TUPLE_SUBJECT_PROPERTY, "*");
qba.must(qb1);
qba.must(qb2);
log.logDebug("TupleQuery.listTuplesByLabel- "+qba.toString());
r = jsonModel.runQuery(TOPIC_INDEX, qba, 0, -1, CORE_TYPE);
if (r.hasError())
result.addErrorString(r.getErrorString());
if (r.getResultObject()!= null)
subresult.addAll((List<String>)r.getResultObject());
}
if (!subresult.isEmpty()) {
List<String>rl = new ArrayList<String>();
rl.addAll(subresult);
result.setResultObject(rl);
}
return result;
}
@Override
public IResult listTuplesByPredTypeAndObjectOrSubject(String predType,
String obj, int start, int count, ITicket credentials) {
BoolQueryBuilder qba = QueryBuilders.boolQuery();
QueryBuilder qb1 = QueryBuilders.termQuery(ITopicQuestsOntology.INSTANCE_OF_PROPERTY_TYPE, predType);
QueryBuilder qb2 = QueryBuilders.termQuery(ITopicQuestsOntology.TUPLE_OBJECT_PROPERTY, obj);
QueryBuilder qb3 = QueryBuilders.termQuery(ITopicQuestsOntology.TUPLE_SUBJECT_PROPERTY, obj);
qba.must(qb1);
qba.should(qb2);
qba.should(qb3);
log.logDebug("TupleQuery.listTuplesByPredTypeAndObjectOrSubject- "+qba.toString());
IResult result = jsonModel.runQuery(IJSONTopicMapOntology.TOPIC_INDEX, qba, start, count, IJSONTopicMapOntology.CORE_TYPE);
System.out.println("AAA "+result.getResultObject());
if (result.getResultObject() != null) {
List<String>docs = (List<String>)result.getResultObject();
result.setResultObject(null);
if (docs != null && !docs.isEmpty()) {
List<JSONObject>tups = new ArrayList<JSONObject>();
result.setResultObject(tups);
String json;
ITuple n;
JSONObject jo;
Iterator<String>itr = docs.iterator();
try {
while(itr.hasNext()) {
json = itr.next();
jo = jsonToJSON(json);
if (credentialUtil.checkCredentials(jo,credentials))
tups.add(jo);
}
} catch (Exception e) {
log.logError(e.getMessage(), e);
result.addErrorString(e.getMessage());
}
}
}
return result;
}
@Override
public IResult getTupleBySignature(String signature, ITicket credentials) {
log.logDebug("TupleQuery.getTupleBySignature- "+signature);
IResult result = jsonModel.getDocumentByProperty(IJSONTopicMapOntology.TOPIC_INDEX, ITopicQuestsOntology.TUPLE_SIGNATURE_PROPERTY, signature, IJSONTopicMapOntology.CORE_TYPE);
if (result.getResultObject() != null) {
List<String>l = (List<String>)result.getResultObject();
result.setResultObject(null);
if (!l.isEmpty()) {
String json = l.get(0);
try {
JSONObject jo = jsonToJSON(json);
INode n = new Node(jo);
result.setResultObject(n);
} catch (Exception e) {
log.logError(e.getMessage(), e);
result.addErrorString(e.getMessage());
}
}
}
return result;
}
}