package com.thinkbiganalytics.metadata.modeshape.support;
/*-
* #%L
* thinkbig-metadata-modeshape
* %%
* Copyright (C) 2017 ThinkBig Analytics
* %%
* 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.
* #L%
*/
import com.thinkbiganalytics.metadata.modeshape.MetadataRepositoryException;
import org.modeshape.jcr.api.JcrTools;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.jcr.Node;
import javax.jcr.NodeIterator;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.Value;
import javax.jcr.query.Query;
import javax.jcr.query.QueryResult;
import javax.jcr.query.Row;
import javax.jcr.query.RowIterator;
/**
*/
public class JcrQueryUtil {
public static <T extends Object> List<T> find(Session session, String query, Class<T> type) {
return find(session, query, null, type);
}
public static <T extends Object> List<T> find(Session session, String query, Map<String, String> bindParams, Class<T> type) {
JcrTools tools = new JcrTools();
try {
QueryResult result = query(session, query, bindParams);
return queryResultToList(result, type);
} catch (RepositoryException e) {
throw new MetadataRepositoryException("Unable to findAll for query : " + query, e);
}
}
public static <T extends Object> List<T> queryResultToList(QueryResult result, Class<T> type) {
return queryResultToList(result, type, null);
}
public static <T extends Object> List<T> queryResultToList(QueryResult result, Class<T> type, Integer fetchSize) {
List<T> entities = new ArrayList<>();
if (result != null) {
try {
NodeIterator nodeIterator = result.getNodes();
int cntr = 0;
while (nodeIterator.hasNext()) {
Node node = nodeIterator.nextNode();
T entity = JcrUtil.constructNodeObject(node, type, null);
entities.add(entity);
cntr++;
if (fetchSize != null && cntr == fetchSize) {
break;
}
}
} catch (RepositoryException e) {
throw new MetadataRepositoryException("Unable to parse QueryResult to List for type : " + type, e);
}
}
return entities;
}
public static <T extends Object> List<T> queryRowItrNodeResultToList(QueryResult result, Class<T> type, String nodeName) {
return queryRowItrNodeResultToList(result, type, nodeName, null);
}
public static <T extends Object> List<T> queryRowItrNodeResultToList(QueryResult result, Class<T> type, String nodeName, Integer fetchSize) {
List<T> entities = new ArrayList<>();
if (result != null) {
try {
RowIterator rowIterator = result.getRows();
int cntr = 0;
while (rowIterator.hasNext()) {
Row row = rowIterator.nextRow();
Node node = row.getNode(nodeName);
T entity = JcrUtil.constructNodeObject(node, type, null);
entities.add(entity);
cntr++;
if (fetchSize != null && cntr == fetchSize) {
break;
}
}
} catch (RepositoryException e) {
throw new MetadataRepositoryException("Unable to parse QueryResult to List Row Iteration for type" + type + " and Node: " + nodeName, e);
}
}
return entities;
}
public static <T extends Object> T findFirst(Session session, String query, Class<T> type) {
return findFirst(session, query, null, type);
}
public static <T extends Object> T findFirst(Session session, String query, Map<String, String> bindParams, Class<T> type) {
JcrTools tools = new JcrTools();
try {
QueryResult result = query(session, query, bindParams);
List<T> list = queryResultToList(result, type, 1);
if (list != null && list.size() > 0) {
return list.get(0);
} else {
return null;
}
} catch (RepositoryException e) {
throw new MetadataRepositoryException("Unable to findFirst for query : " + query, e);
}
}
public static QueryResult query(Session session, String queryExpression) throws RepositoryException {
return query(session, queryExpression, null);
}
public static QueryResult query(Session session, String queryExpression, Map<String, String> bindParams) throws RepositoryException {
QueryResult results = null;
Query query = session.getWorkspace().getQueryManager().createQuery(queryExpression, "JCR-SQL2");
if (bindParams != null && !bindParams.isEmpty()) {
Iterator e = bindParams.entrySet().iterator();
while (e.hasNext()) {
Map.Entry entry = (Map.Entry) e.next();
String key = (String) entry.getKey();
Value value = session.getValueFactory().createValue((String) entry.getValue());
query.bindValue(key, value);
}
}
results = query.execute();
return results;
}
}