private PathQuery getQuery1(Model model) { PathQuery q = new PathQuery(model); q.addView("Employee.name"); q.addConstraint(new PathConstraintAttribute("Employee.age", ConstraintOp.LESS_THAN, "50")); return q; }
private PathQuery getQuery2(Model model) { PathQuery q = new PathQuery(model); q.addView("Employee.name"); q.addView("Employee.department.name"); q.addOrderBy("Employee.age", OrderDirection.ASC); q.addConstraint(new PathConstraintAttribute("Employee.age", ConstraintOp.LESS_THAN, "50")); q.addConstraint(new PathConstraintAttribute("Employee.department.name", ConstraintOp.EQUALS, "Fred")); q.setConstraintLogic("A or B"); q.setOuterJoinStatus("Employee.department", OuterJoinStatus.INNER); q.setDescription("Flibble"); q.setDescription("Employee.name", "Albert"); return q; }
checkPathFormat(path); deVerify(); for (String v : getView()) { if (isPathUnder(path, v)) { removeView(v); for (OrderElement order : getOrderBy()) { if (isPathUnder(path, order.getOrderPath())) { removeOrderBy(order.getOrderPath()); for (PathConstraint con : getConstraints().keySet()) { if (isPathUnder(path, con.getPath())) { removeConstraint(con); for (String join : getOuterJoinStatus().keySet()) { if (isPathUnder(path, join)) { setOuterJoinStatus(join, null); for (String desc : getDescriptions().keySet()) { if (isPathUnder(path, desc) && !isAnyViewWithPathUnder(desc)) { setDescription(desc, null);
/** * Returns the paths descriptions for the view. * @return A list of column names */ public List<String> getColumnHeaders() { List<String> columnNames = new ArrayList<String>(); for (String viewString : getView()) { columnNames.add(getGeneratedPathDescription(viewString)); } return columnNames; }
/** @return the attributes that should go in the head of a JSON object. **/ protected Map<String, Object> getHeadAttributes() { Map<String, Object> ret = new LinkedHashMap<String, Object>(); ret.put("title", getTitle()); ret.put("description", getDescription()); ret.put("select", getView()); // LOGIC - only if there is some. Just logic = A is dumb. String constraintLogic = getConstraintLogic(); if (constraintLogic != null && constraintLogic.length() > 1) { ret.put("constraintLogic", constraintLogic); } return ret; }
public void testUpdate() throws Exception { PathQuery query = new PathQuery(Model.getInstanceByName("oldtestmodel")); query.addView("CEOTest.name"); query.addView("CEOTest.title"); query.addView("CEOTest.company.name"); query.addView("CEOTest.sal"); query.setDescription("CEOTest.name", "CEO name"); query.addConstraint(new PathConstraintAttribute("CEOTest.name", ConstraintOp.CONTAINS, "ploy")); query.addConstraint(new PathConstraintAttribute("CEOTest.company.name", ConstraintOp.CONTAINS, "pany")); query.addConstraint(new PathConstraintLookup( "CEOTest.company.CEOTest.department.company.CEOTest", "ttt", "DepartmentA1")); query.setOuterJoinStatus("CEOTest.company", OuterJoinStatus.OUTER); query.addOrderBy("CEOTest.name", OrderDirection.ASC); query.addOrderBy("CEOTest.sal", OrderDirection.ASC); assertEquals(4, queryUpdated.getView().size()); assertEquals("CEO.name", queryUpdated.getView().get(0)); assertEquals("CEO.title", queryUpdated.getView().get(1)); assertEquals("CEO.company.name", queryUpdated.getView().get(2)); assertEquals("CEO.salary", queryUpdated.getView().get(3)); assertEquals(1, queryUpdated.getDescriptions().size()); assertEquals("CEO name", queryUpdated.getDescription("CEO.name")); assertEquals(3, queryUpdated.getConstraints().size()); assertEquals(1, queryUpdated.getConstraintsForPath("CEO.name").size()); PathConstraintAttribute constraint1 = (PathConstraintAttribute) queryUpdated .getConstraintsForPath("CEO.name").get(0);
public void testValidQueries() throws Exception { Model model = Model.getInstanceByName("testmodel"); PathQuery q = new PathQuery(model); q.addViews("Employee.name", "Employee.department.name", "Employee.age"); q.addOrderBy("Employee.name", OrderDirection.ASC); q.addOrderBy("Employee.age", OrderDirection.DESC); q.addConstraint(new PathConstraintAttribute("Employee.name", ConstraintOp.EQUALS, "Fred")); q.addConstraint(new PathConstraintNull("Employee.department.name", ConstraintOp.IS_NOT_NULL)); q.addConstraint(new PathConstraintBag("Employee", ConstraintOp.IN, "bagName")); q.addConstraint(new PathConstraintLookup("Employee.department", "DepartmentA1", "CompanyA")); q.setOuterJoinStatus("Employee.department", OuterJoinStatus.INNER); q.addConstraint(new PathConstraintSubclass("Employee.department.employees", "Manager")); q.addConstraint(new PathConstraintLoop("Employee", ConstraintOp.EQUALS, "Employee.department.employees")); q.setDescription("Employee", "Flibble"); q.setDescription("Hello"); assertEquals(Collections.EMPTY_LIST, q.verifyQuery()); String marshalled = PathQueryBinding.marshal(q, "test", "testmodel", 1); assertEquals("<query name=\"test\" model=\"testmodel\" view=\"Employee.name Employee.department.name Employee.age\" longDescription=\"Hello\" sortOrder=\"Employee.name asc Employee.age desc\" constraintLogic=\"A and B and C and D and E\"><join path=\"Employee.department\" style=\"INNER\"/><pathDescription pathString=\"Employee\" description=\"Flibble\"/><constraint path=\"Employee.name\" code=\"A\" op=\"=\" value=\"Fred\"/><constraint path=\"Employee.department.name\" code=\"B\" op=\"IS NOT NULL\"/><constraint path=\"Employee\" code=\"C\" op=\"IN\" value=\"bagName\"/><constraint path=\"Employee.department\" code=\"D\" op=\"LOOKUP\" value=\"DepartmentA1\" extraValue=\"CompanyA\"/><constraint path=\"Employee.department.employees\" type=\"Manager\"/><constraint path=\"Employee\" code=\"E\" op=\"=\" loopPath=\"Employee.department.employees\"/></query>", marshalled); PathQuery rt = PathQueryBinding.unmarshalPathQuery(new StringReader(marshalled), 1); assertEquals(marshalled, PathQueryBinding.marshal(rt, "test", "testmodel", 1)); assertEquals(q.toString(), rt.toString()); PathQuery unmarshalled = PathQueryBinding.unmarshalPathQuery(new StringReader("<query name=\"test\" model=\"testmodel\" view=\"Employee.name Employee.department.name Employee.age\" longDescription=\"Hello\" sortOrder=\"Employee.name asc Employee.age desc\"><join path=\"Employee.department\" style=\"INNER\"/><pathDescription pathString=\"Employee\" description=\"Flibble\"/><constraint path=\"Employee.name\" op=\"=\" value=\"Fred\"/><constraint path=\"Employee.department.name\" op=\"IS NOT NULL\"/><constraint path=\"Employee\" op=\"IN\" value=\"bagName\"/><constraint path=\"Employee.department\" op=\"LOOKUP\" value=\"DepartmentA1\" extraValue=\"CompanyA\"/><constraint path=\"Employee.department.employees\" type=\"Manager\"/><constraint path=\"Employee\" op=\"=\" loopPath=\"Employee.department.employees\"/></query>"), 1); assertEquals(q.toString(), unmarshalled.toString()); assertEquals(marshalled, PathQueryBinding.marshal(unmarshalled, "test", "testmodel", 1)); }
public void testTicket2636() throws Exception { Model model = Model.getInstanceByName("testmodel"); PathQuery q = new PathQuery(model); // Add views q.addView("Company.CEO.address.address"); // Add constraints and you can edit the constraint values below q.addConstraint(Constraints.lookup("Company", "Capitol Versicherung AG", ""), "A"); q.addConstraint(Constraints.lessThan("Company.vatNumber", "392018"), "B"); q.addConstraint(Constraints.eq("Company.departments.name", "Accounting"), "C"); // Add join status q.setOuterJoinStatus("Company.CEO", OuterJoinStatus.OUTER); // Add constraintLogic q.setConstraintLogic("(A and B) or C"); assertTrue("The query is now invalid", !q.isValid()); List<String> messages = q.fixUpForJoinStyle(); assertTrue("We should get a message that the logic was changed", messages.size() == 1 && messages.get(0).contains("Changed constraint logic")); assertNotNull(q.getConstraintLogic()); assertEquals("A and B and C", q.getConstraintLogic()); assertTrue("The query is now valid", q.isValid()); }
private void appendPathQuery(StringBuffer sb, PathQuery query) throws InvalidQueryException { if (query.getDescription() != null && !"".equals(query.getDescription())) { sb.append("# query description - " + query.getDescription() + endl + endl); sb.append("service.new_query(\"" + query.getRootClass() + "\")." + endl); } catch (PathException e1) { throw new InvalidQueryException(e1.getMessage()); for (Entry<String, String> entry: query.getSubclasses().entrySet()) { sb.append(INDENT + new RubyWhereClause(entry.getKey(), entry.getValue()) + "." + endl); if (query.getView() == null || query.getView().isEmpty()) { throw new InvalidQueryException("No fields selected for output (view is empty)"); sb.append(new PresentedList<String>(deheadify(query.getView()))); sb.append(")." + endl); if (query.getConstraints() != null && !query.getConstraints().isEmpty()) { for (PathConstraint pc : query.getConstraints().keySet()) { if (query.getConstraints().get(pc) == null) { continue; String logic = query.getConstraintLogic(); if ((codedCons > 0) && (logic != null) if (query.getOrderBy() != null && !query.getOrderBy().isEmpty()) { // no sort order if (query.getOrderBy().size() == 1
if (StringUtils.isNotBlank(query.getDescription())) { sb.append("# query description - " + query.getDescription() + endl + endl); sb.append("query = service.new_query(\"" + query.getRootClass() + "\")" + endl); } catch (PathException e) { return getInvalidQuery() + formatProblems(query.verifyQuery()); if (query.getConstraints() != null && !query.getConstraints().isEmpty()) { for (Entry<PathConstraint, String> entry : query.getConstraints().entrySet()) { PathConstraint pc = entry.getKey(); String constraint = ""; if (query.getOrderBy() != null && !query.getOrderBy().isEmpty()) { // no sort order if (// The default query.getOrderBy().size() == 1 && query.getOrderBy().get(0).getOrderPath().equals(query.getView().get(0)) && query.getOrderBy().get(0).getDirection() == OrderDirection.ASC) { sb.append("# " + DEFAULT_SO_MSG + endl + "# "); } else { sb.append("# " + CUSTOM_SO_MSG + endl); for (OrderElement oe : query.getOrderBy()) { sb.append("query.add_sort_order("); sb.append("\"" + oe.getOrderPath() + "\", \"" + oe.getDirection() + "\""); if (query.getConstraintLogic() != null && !"".equals(query.getConstraintLogic())) { String logic = query.getConstraintLogic();
public void testView() throws Exception { Model model = Model.getInstanceByName("testmodel"); PathQuery q = new PathQuery(model); assertEquals(model, q.getModel()); assertEquals(Collections.EMPTY_LIST, q.getView()); q.addView("Employee.name"); assertEquals(Collections.singletonList("Employee.name"), q.getView()); q.addViews("Employee.department.name", "Employee.department.address.address"); assertEquals(Arrays.asList("Employee.name", "Employee.department.name", "Employee.department.address.address"), q.getView()); q.removeView("Employee.name"); assertEquals(Arrays.asList("Employee.department.name", "Employee.department.address.address"), q.getView()); try { q.removeView("lkjadsfldjsaf"); fail("Expected NoSuchElementException"); } catch (NoSuchElementException e) { assertEquals(Arrays.asList("Employee.department.name", "Employee.department.address.address"), q.getView()); q.addViewSpaceSeparated("Employee.name Employee.department.company.name"); assertEquals(Arrays.asList("Employee.department.name", "Employee.department.address.address", "Employee.name", "Employee.department.company.name"), q.getView()); q.clearView(); assertEquals(Collections.EMPTY_LIST, q.getView()); try { q.addView("Emploelkjadf k adf asd"); fail("Expected IllegalArgumentException"); } catch (IllegalArgumentException e) { q.addViews("kjsdaf a;lkjadsf", "Employee.name"); fail("Expected IllegalArgumentException"); } catch (IllegalArgumentException e) {
public void testAttributeConstraints() throws Exception { Model model = Model.getInstanceByName("testmodel"); PathQuery q = new PathQuery(model); q.addViews("Employee.age"); assertEquals(Collections.EMPTY_MAP, q.getConstraints()); PathConstraintAttribute c = new PathConstraintAttribute("Employee.name", ConstraintOp.EQUALS, "Fred"); String code = q.addConstraint(c); assertEquals(Collections.singletonMap(c, code), q.getConstraints()); assertEquals("Employee.name", c.getPath()); assertEquals(ConstraintOp.EQUALS, c.getOp()); q.addConstraint(null); fail("Expected NullPointerException"); } catch (NullPointerException e) { assertEquals(Collections.singletonMap(c, code), q.getConstraints()); assertEquals(code, q.addConstraint(c)); assertEquals(Collections.singletonMap(c, code), q.getConstraints()); assertEquals(c, q.getConstraintForCode(code)); try { q.getConstraintForCode(null); fail("Expected NullPointerException"); } catch (NullPointerException e) { q.getConstraintForCode("Z"); fail("Expected NoSuchElementException"); } catch (NoSuchElementException e) { String code2 = q.addConstraint(c2); assertFalse("Codes are the same: " + code + " and " + code2 + ", constraints: " + q.getConstraints(), code.equals(code2));
public void testOrderBy() throws Exception { Model model = Model.getInstanceByName("testmodel"); PathQuery q = new PathQuery(model); assertEquals(Collections.EMPTY_LIST, q.getOrderBy()); q.addView("Employee.age"); q.addOrderBy("Employee.name", OrderDirection.ASC); assertEquals("Employee.name", q.getOrderBy().iterator().next().getOrderPath()); assertEquals(OrderDirection.ASC, q.getOrderBy().iterator().next().getDirection()); assertEquals(Collections.singletonList(new OrderElement("Employee.name", OrderDirection.ASC)), q.getOrderBy()); q.addOrderBys(new OrderElement("Employee.department.name", OrderDirection.ASC), new OrderElement("Employee.department.address.address", OrderDirection.DESC)); assertEquals(Arrays.asList(new OrderElement("Employee.name", OrderDirection.ASC), new OrderElement("Employee.department.name", OrderDirection.ASC), new OrderElement("Employee.department.address.address", OrderDirection.DESC)), q.getOrderBy()); Iterator<OrderElement> oeIter = q.getOrderBy().iterator(); OrderElement oe1 = oeIter.next(); OrderElement oe2 = oeIter.next(); assertTrue(oe1.equals(new OrderElement("Employee.name", OrderDirection.ASC))); assertFalse(oe1.equals(new OrderElement("Employee.name", OrderDirection.DESC))); q.removeOrderBy("Employee.name"); assertEquals(Arrays.asList(new OrderElement("Employee.department.name", OrderDirection.ASC), new OrderElement("Employee.department.address.address", OrderDirection.DESC)), q.getOrderBy()); try { q.removeOrderBy("lkjadsfldjsaf"); fail("Expected NoSuchElementException"); } catch (NoSuchElementException e) { assertEquals(Arrays.asList(new OrderElement("Employee.department.name", OrderDirection.ASC), new OrderElement("Employee.department.address.address", OrderDirection.DESC)), q.getOrderBy()); q.addOrderBySpaceSeparated("Employee.name asc Employee.department.company.name desc"); assertEquals(Arrays.asList(new OrderElement("Employee.department.name", OrderDirection.ASC), new OrderElement("Employee.department.address.address", OrderDirection.DESC), new OrderElement("Employee.name", OrderDirection.ASC), new OrderElement("Employee.department.company.name", OrderDirection.DESC)), q.getOrderBy()); q.clearOrderBy(); assertEquals(Collections.EMPTY_LIST, q.getOrderBy()); try {
public void testFixingConstraintLogicWhilePreservingWhatWeCan() throws Exception { Model model = Model.getInstanceByName("testmodel"); PathQuery q = new PathQuery(model); q.addViews("Employee.name", "Employee.department.manager.name", "Employee.department.manager.address.address"); q.addConstraint(Constraints.eq("Employee.age", "28")); q.addConstraint(Constraints.eq("Employee.fullTime", "true")); q.addConstraint(Constraints.eq("Employee.department.manager.name", "David")); q.addConstraint(Constraints.eq("Employee.department.manager.address.address", "123 Some St.")); q.setOuterJoinStatus("Employee.department.manager", OuterJoinStatus.OUTER); q.setConstraintLogic("A or B or C or D"); List<String> messages = q.fixUpForJoinStyle(); assertTrue("We should get a message that the logic was changed", messages.size() == 1 && messages.get(0).contains("Changed constraint logic")); assertNotNull(q.getConstraintLogic()); assertEquals("(A or B) and (C or D)", q.getConstraintLogic()); assertTrue("The query is now valid", q.isValid()); }
public void testDescription() throws Exception { Model model = Model.getInstanceByName("testmodel"); PathQuery q = new PathQuery(model); q.addView("Employee.name"); q.setDescription("Employee.name", "Flibble"); assertEquals("Flibble", q.getDescription("Employee.name")); assertEquals(Collections.EMPTY_LIST, q.verifyQuery()); assertEquals("<query name=\"test\" model=\"testmodel\" view=\"Employee.name\" longDescription=\"\"><pathDescription pathString=\"Employee.name\" description=\"Flibble\"/></query>", PathQueryBinding.marshal(q, "test", "testmodel", 1)); assertNull(q.getDescription("alkjhadlfkjh")); try { q.setDescription(null, "Flibble"); fail("Expected NullPointerException"); } catch (NullPointerException e) { q.setDescription("Empsda adsfasdf", "Flibble"); fail("Expected IllegalArgumentException"); } catch (IllegalArgumentException e) { q.getDescription(null); fail("Expected NullPointerException"); } catch (NullPointerException e) { q.getDescription("Empsda adsfasdf"); fail("Expected IllegalArgumentException"); } catch (IllegalArgumentException e) { assertEquals(Collections.singletonMap("Employee.name", "Flibble"), q.getDescriptions()); q.setDescription("Employee.name", null); assertEquals(Collections.EMPTY_MAP, q.getDescriptions()); assertEquals(Collections.EMPTY_LIST, q.verifyQuery());
PathQuery allCompanies = new PathQuery(model); allCompanies.addView("Company.name"); expected.put("allCompanies", allCompanies); PathQuery employeesWithOldManagers = new PathQuery(model); employeesWithOldManagers.addViews("Employee.name", "Employee.age", "Employee.department.name", "Employee.department.manager.age"); employeesWithOldManagers.addConstraint(new PathConstraintAttribute("Employee.department.manager.age", ConstraintOp.GREATER_THAN, "10")); employeesWithOldManagers.setDescription("Employee.department", "Department of the Employee"); expected.put("employeesWithOldManagers", employeesWithOldManagers); PathQuery companyInBag = new PathQuery(model); companyInBag.addView("Company"); companyInBag.addConstraint(new PathConstraintBag("Company", ConstraintOp.IN, "bag1")); expected.put("companyInBag", companyInBag); PathQuery queryWithConstraint = new PathQuery(model); queryWithConstraint.addViews("Company.name", "Company.departments.name", "Company.departments.employees.name", "Company.departments.employees.title"); queryWithConstraint.addConstraint(new PathConstraintSubclass("Company.departments.employees", "CEO")); expected.put("queryWithConstraint", queryWithConstraint); PathQuery employeesInBag = new PathQuery(model); employeesInBag.addView("Employee.name"); employeesInBag.addConstraint(new PathConstraintBag("Employee.end", ConstraintOp.IN, "bag1"));
public void testLoopConstraints() throws Exception { PathQuery pq = new PathQuery(Model.getInstanceByName("testmodel")); pq.addViews("Employee.name"); pq.addViews("Employee.department.manager.name"); pq.addConstraint(new PathConstraintLoop("Employee.department.employees", ConstraintOp.EQUALS, "Employee")); pq.addOrderBy("Employee.name", OrderDirection.ASC); assertEquals(pq.toString(), savedQueries.get("loopConstraint").toString()); // try query with `value` instead of `loopPath` assertEquals(pq.toString(), savedQueries.get("loopConstraintAlt").toString()); }
public void testGetPathQueryForMatches() { Model model = os.getModel(); PathQuery pathQuery = new PathQuery(model); pathQuery.addView("Employee.department.company.contractors.name"); pathQuery.addView("Employee.name"); pathQuery.addOrderBy("Employee.department.company.contractors.name", OrderDirection.ASC); pathQuery.addConstraint(Constraints.in(config.getStartClass(), bag.getName())); assertEquals(pathQuery, widget.getPathQueryForMatches()); }
public void testNullReferenceOuterJoin() throws Exception { PathQuery pq = new PathQuery(os.getModel()); pq.addViews("Department.company.name"); pq.addConstraint(new PathConstraintNull("Department.company", ConstraintOp.IS_NOT_NULL)); pq.setOuterJoinStatus("Department.company", OuterJoinStatus.OUTER); Query expected = new Query(); QueryClass qc = new QueryClass(Department.class); expected.addFrom(qc); expected.addToSelect(qc); // outer join to select Department.company.name QueryObjectPathExpression comOuter = new QueryObjectPathExpression(qc, "company"); expected.addToSelect(comOuter); // Company IS_NOT_NULL QueryObjectReference ref = new QueryObjectReference(qc, "company"); ContainsConstraint cc = new ContainsConstraint(ref, ConstraintOp.IS_NOT_NULL); expected.setConstraint(cc); Query actual = MainHelper.makeQuery(pq, new HashMap(), null, bagQueryRunner, new HashMap()); assertEquals(expected.toString(), actual.toString()); // Same test for IS_NOT_NULL pq = new PathQuery(os.getModel()); pq.addView("Department.company.name"); pq.addConstraint(new PathConstraintNull("Department.company", ConstraintOp.IS_NOT_NULL)); pq.setOuterJoinStatus("Department.company", OuterJoinStatus.OUTER); cc = new ContainsConstraint(ref, ConstraintOp.IS_NOT_NULL); expected.setConstraint(cc); actual = MainHelper.makeQuery(pq, new HashMap(), null, bagQueryRunner, new HashMap()); assertEquals(expected.toString(), actual.toString()); }