/**
* Axelor Business Solutions
*
* Copyright (C) 2016 Axelor (<http://axelor.com>).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License, version 3,
* as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.axelor.apps.base.service.querie;
import java.math.BigInteger;
import java.util.List;
import java.util.Map;
import java.util.Set;
import com.axelor.apps.base.db.IQuerie;
import com.axelor.apps.base.db.Querie;
import com.axelor.apps.base.exceptions.IExceptionMessage;
import com.axelor.db.JPA;
import com.axelor.db.Model;
import com.axelor.db.Query;
import com.axelor.exception.AxelorException;
import com.axelor.exception.db.IException;
import com.axelor.i18n.I18n;
import com.axelor.meta.db.MetaModel;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
public class QuerieService {
public List<Long> getQuerieResult(Set<Querie> querieSet) throws AxelorException {
Set<Long> idList = Sets.newHashSet();
if(querieSet != null) {
for (Querie querie : querieSet) {
idList.addAll(this.getQuerieResult(querie));
}
}
return Lists.newArrayList(idList);
}
public List<Long> getQuerieResult(Querie querie) throws AxelorException {
List<Long> result = Lists.newArrayList();
int requestType = querie.getType();
String filter = querie.getQuery();
if(filter == null || filter.isEmpty()) {
throw new AxelorException(String.format(I18n.get(IExceptionMessage.QUERIE_1), querie.getId()), IException.MISSING_FIELD);
}
Class<?> klass = this.getClass(querie.getMetaModel());
try {
if(requestType == IQuerie.QUERY_SELECT_SQL) {
result = this.runSqlRequest(filter);
}
else if(requestType == IQuerie.QUERY_SELECT_JPQL) {
result = this.runJpqlRequest(filter,klass);
}
}
catch (Exception e) {
e.printStackTrace();
throw new AxelorException(String.format(I18n.get(IExceptionMessage.QUERIE_2), querie.getId()), IException.CONFIGURATION_ERROR);
}
return result;
}
@SuppressWarnings("unchecked")
public List<Long> runSqlRequest(String filter) {
List<Long> idLists = Lists.newArrayList();
javax.persistence.Query query = JPA.em().createNativeQuery(filter);
List<BigInteger> queryResult = query.getResultList();
for (BigInteger bi : queryResult) {
idLists.add(bi.longValue());
}
return idLists;
}
@SuppressWarnings({ "rawtypes", "unchecked" })
public List<Long> runJpqlRequest(String filter, Class<?> klass) {
List<Long> idLists = Lists.newArrayList();
List<Map> result = Query.of((Class<? extends Model>) klass).filter(filter).select("id").fetch(0, 0);
for (Map map : result) {
idLists.add(Long.valueOf(map.get("id").toString()));
}
return idLists;
}
private Class<?> getClass(MetaModel metaModel) {
String model = metaModel.getFullName();
try {
return Class.forName(model);
} catch (NullPointerException e) {
} catch (ClassNotFoundException e) {
}
return null;
}
public void checkQuerie(Querie querie) throws AxelorException {
this.getQuerieResult(querie);
}
}