Hello ,
I'm writing advanced API Query to fetch the all parts latest version and iteration but I'm unable to execute the query. Here my code:
import wt.fc.QueryResult; import wt.inf.library.WTLibrary; import wt.part.WTPart; import wt.part.WTPartMaster; import wt.query.ClassAttribute; import wt.query.OrderBy; import wt.query.QueryException; import wt.query.QuerySpec; import wt.query.SQLFunction; import wt.query.SearchCondition; import wt.query.SubSelectExpression; /** * * @author mgangappa */ public class Extractor { public static void main(String[] args) { Extractor ex = new Extractor(); ex.getAllPartsLatestVersionAndIteration(); } public void getAllPartsLatestVersionAndIteration() { try { final QuerySpec qs = new QuerySpec(); qs.setAdvancedQueryEnabled(true); final int lib = qs.addClassList(WTLibrary.class, false); final int masterIndex = qs.addClassList(WTPartMaster.class, false); final int partIndex = qs.addClassList(WTPart.class, true); final QuerySpec subSelect = new QuerySpec(); final int partSubInt = subSelect.appendClassList(WTPart.class, false); final SQLFunction max = SQLFunction.newSQLFunction(SQLFunction.MAXIMUM, new ClassAttribute(WTPart.class, "iterationInfo.branchId")); subSelect.appendSelect(new ClassAttribute(WTPart.class, "masterReference.key.id"), new int[]{partSubInt}, true); subSelect.appendSelect(max, new int[]{partSubInt}, true); subSelect.setAdvancedQueryEnabled(true); subSelect.appendGroupBy(new ClassAttribute(WTPart.class, "masterReference.key.id"), new int[]{partSubInt}, true); qs.appendWhere(new SearchCondition(WTLibrary.class, WTLibrary.NAME, SearchCondition.NOT_LIKE, "%test%"), new int[]{lib}); qs.appendAnd(); qs.appendWhere(new SearchCondition(WTPartMaster.class, "containerReference.key.id", WTLibrary.class, "thePersistInfo.theObjectIdentifier.id"), new int[]{masterIndex, lib}); qs.appendAnd(); qs.appendWhere(new SearchCondition(WTPart.class, "masterReference.key.id", WTPartMaster.class, "thePersistInfo.theObjectIdentifier.id"), new int[]{partIndex, masterIndex}); qs.appendAnd(); qs.appendWhere(new SearchCondition(WTPart.class, WTPart.LATEST_ITERATION, SearchCondition.EQUAL, true), new int[]{partIndex}); qs.appendAnd(); final SubSelectExpression inList = new SubSelectExpression(subSelect); inList.setAccessControlRequired(false); qs.appendWhere(new SearchCondition(new ClassAttribute(WTPart.class, "iterationInfo.branchId"), SearchCondition.IN, inList), new int[]{partIndex}); qs.appendOrderBy(new OrderBy(new ClassAttribute(WTPartMaster.class, WTPartMaster.NUMBER), true), new int[] {masterIndex}); QueryResult qr = ExecuteQueryInServerContext.executeAdvanceQueryInServer(qs, "executeQuery"); } catch (QueryException ex) { ex.printStackTrace(); } } }
I'm executing it in the RemoteMethodServer.invoke (see below code):
import java.lang.reflect.InvocationTargetException; import java.rmi.RemoteException; import wt.fc.PersistenceHelper; import wt.fc.PersistenceServerHelper; import wt.fc.QueryResult; import wt.method.RemoteAccess; import wt.method.RemoteMethodServer; import wt.pds.StatementSpec; import wt.query.QuerySpec; import wt.util.WTException; /** * * @author mgangappa */ public class ExecuteQueryInServerContext implements RemoteAccess { public static QueryResult executeAdvanceQueryInServer(QuerySpec query, String method) { Class[] pClasses = new Class[1]; pClasses[0] = QuerySpec.class; Object[] pObjects = new Object[1]; if (query == null) { return null; } else { pObjects[0] = query; } try { return (QueryResult) RemoteMethodServer.getDefault().invoke(method, ExecuteQueryInServerContext.class.getName(), null, pClasses, pObjects); } catch (RemoteException ex) { ex.printStackTrace(); } catch (InvocationTargetException ex) { ex.printStackTrace(); } return null; } public static QueryResult executeQuery(QuerySpec qs) throws WTException { System.out.println("executeQuery => PersistenceServerHelper "); QueryResult result = PersistenceServerHelper.manager.query(qs); return result; } public static QueryResult executeQueryManager(QuerySpec qs) throws WTException { QueryResult result = PersistenceHelper.manager.find((StatementSpec) qs); return result; } }
But I'm keep getting the below error:
nServerContext, executeQuery, , 0, 0, 0.0, 0, 0.0, 0.01, 0.007444714 (wt.pds.pdsResource/23) wt.pds.AdvancedQueryAccessException: Access is not permitted to advanced query capabilities. at wt.pds.SQLDatabasePds.query(SQLDatabasePds.java:616) at wt.pom.PersistentObjectManager.query(PersistentObjectManager.java:1108) at wt.pom.PersistentObjectManager.query(PersistentObjectManager.java:1017) at wt.fc.StandardPersistenceManager._query(StandardPersistenceManager.java:1878) at wt.fc.StandardPersistenceManager.query(StandardPersistenceManager.java:1417) at wt.fc.StandardPersistenceManager.query(StandardPersistenceManager.java:1301) at com.google.extractor.ExecuteQueryInServerContext.executeQuery(ExecuteQueryInServerContext.java:50)
What I'm doing wrong? Do I need to set or change config?
Thanks,
Manjunath Reddy