&& !query.getJoins().isEmpty()) { continue;
modified.setTypeName(typeMap.getOriginalName()); modified.setFilter(retypeFilter(q.getFilter(), typeMap)); List<Join> joins = q.getJoins(); if (!joins.isEmpty()) { modified.getJoins().clear(); for (Join join : joins) { FeatureTypeMap map = (FeatureTypeMap) backwardsMap.get(join.getTypeName()); if (map == null) { modified.getJoins().add(join); } else { final FeatureTypeMap joinTypeMap = mj.setProperties(join.getProperties()); mj.setFilter(join.getFilter()); modified.getJoins().add(mj);
/** * * Takes into account eventual joins * * @param query * @return */ public SimpleFeatureType getFeatureType(Query query) { SimpleFeatureType result; if (query.getPropertyNames() != Query.ALL_NAMES) { result = SimpleFeatureTypeBuilder.retype(featureType, query.getPropertyNames()); } else { result = featureType; } // add back the joined features in case of join if (!query.getJoins().isEmpty()) { SimpleFeatureTypeBuilder tb = new SimpleFeatureTypeBuilder(); tb.init(result); for (Join join : query.getJoins()) { String joinedFeatureAttribute = join.getAlias(); if (joinedFeatureAttribute == null) { joinedFeatureAttribute = join.getTypeName(); } tb.add(joinedFeatureAttribute, SimpleFeature.class); } result = tb.buildFeatureType(); } return result; }
/** * Copy contructor. * * @param query the query to copy */ public Query(Query query) { this( query.getTypeName(), query.getNamespace(), query.getFilter(), query.getMaxFeatures(), query.getProperties(), query.getHandle()); this.sortBy = query.getSortBy(); this.coordinateSystem = query.getCoordinateSystem(); this.coordinateSystemReproject = query.getCoordinateSystemReproject(); this.version = query.getVersion(); this.hints = query.getHints(); this.startIndex = query.getStartIndex(); this.alias = query.getAlias(); this.joins = new ArrayList(); for (Join j : query.getJoins()) { this.joins.add(new Join(j)); } }
/** * Copy contructor, clones the state of a generic Query into a DefaultQuery * * @param query */ public DefaultQuery(Query query) { this( query.getTypeName(), query.getNamespace(), query.getFilter(), query.getMaxFeatures(), query.getProperties(), query.getHandle()); this.sortBy = query.getSortBy(); this.coordinateSystem = query.getCoordinateSystem(); this.coordinateSystemReproject = query.getCoordinateSystemReproject(); this.version = query.getVersion(); this.hints = query.getHints(); this.startIndex = query.getStartIndex(); this.alias = query.getAlias(); this.joins = query.getJoins(); } }
public void testJoinViewsWithPlaceHolder() { Query joinQuery = new Query("riverFullPlaceHolder"); FilterFactory ff = dataStore.getFilterFactory(); Join join = new Join( "riverFullPlaceHolder", ff.equal( ff.property("a." + aname("river")), ff.property(aname("river")), false)); join.setAlias("a"); joinQuery.getJoins().add(join); try { dataStore.getFeatureSource("riverFullPlaceHolder").getCount(joinQuery); } catch (Exception exception) { assertTrue( exception .getMessage() .contains( "Joins between virtual tables that provide a " + ":where_placeholder: are not supported")); return; } fail("count query should have fail with an exception"); }
public void testTemporalJoin() throws Exception { FilterFactory ff = dataStore.getFilterFactory(); After after = ff.after(ff.property(aname("dt")), ff.property("other." + aname("dt"))); Query q = new Query(tname("dates")); q.getJoins().add(new Join(tname("dates"), after).alias("other")); q.setSortBy(new SortBy[] {ff.sort(aname("dt"), SortOrder.ASCENDING)}); assertDatesMatch(q, "2009-06-28 15:12:41", "2009-09-29 17:54:23", "2009-09-29 17:54:23"); }
public void testJoinViews() throws Exception { Query joinQuery = new Query("riverFull"); FilterFactory ff = dataStore.getFilterFactory(); Join join = new Join( "riverReduced", ff.equal( ff.property("a." + aname("river")), ff.property(aname("river")), false)); join.setAlias("a"); joinQuery.getJoins().add(join); // get the two feature sources ContentFeatureSource fsFull = dataStore.getFeatureSource("riverFull"); ContentFeatureSource fsReduced = dataStore.getFeatureSource("riverReduced"); // check count int expectedCount = fsReduced.getCount(Query.ALL); int count = fsFull.getCount(joinQuery); assertEquals(expectedCount, count); }
public void testJoinSchema() throws Exception { FilterFactory ff = dataStore.getFilterFactory(); Query q = new Query(tname("ft1")); Join join = new Join( tname("ftjoin"), ff.equal( ff.property(aname("stringProperty")), ff.property(aname("name")), true)); join.setAlias("b"); q.getJoins().add(join); SimpleFeatureCollection features = dataStore.getFeatureSource(tname("ft1")).getFeatures(q); SimpleFeatureType schema = features.getSchema(); AttributeDescriptor ad = schema.getDescriptor("b"); assertNotNull(ad); assertEquals(SimpleFeature.class, ad.getType().getBinding()); SimpleFeatureType joinedSchema = (SimpleFeatureType) ad.getUserData().get(ContentDataStore.JOINED_FEATURE_TYPE); assertEquals(dataStore.getSchema(tname("ftjoin")), joinedSchema); }
void doTestSimpleJoinWithPostFilter(boolean exposePrimaryKeys) throws Exception { dataStore.setExposePrimaryKeyColumns(exposePrimaryKeys); FilterFactory ff = dataStore.getFilterFactory(); Filter j = ff.equal(ff.property(aname("stringProperty")), ff.property(aname("name")), true); Query q = new Query(tname("ft1")); q.getJoins().add(new Join(tname("ftjoin"), j)); q.setFilter( ff.equal( ff.function( "__equals", ff.property(aname("stringProperty")), ff.literal("one")), ff.literal(true), true)); SimpleFeatureCollection features = dataStore.getFeatureSource(tname("ft1")).getFeatures(q); assertEquals(1, features.size()); // test with post filter on table being joined q = new Query(tname("ft1")); Join join = new Join(tname("ftjoin"), j); join.filter( ff.equal( ff.function("__equals", ff.property(aname("name")), ff.literal("one")), ff.literal(true), true)); q.getJoins().add(join); features = dataStore.getFeatureSource(tname("ft1")).getFeatures(q); assertEquals(1, features.size()); }
void doTestSimpleJoinWithFilterCount(boolean exposePrimaryKeys) throws Exception { dataStore.setExposePrimaryKeyColumns(exposePrimaryKeys); FilterFactory ff = dataStore.getFilterFactory(); Query q = new Query(tname("ft1")); Join j = new Join( tname("ftjoin"), ff.equal( ff.property(aname("stringProperty")), ff.property(aname("name")), true)); j.filter(ff.greater(ff.property(aname("join1intProperty")), ff.literal(1))); q.getJoins().add(j); q.setFilter(ff.less(ff.property(aname("intProperty")), ff.literal(3))); assertEquals(1, dataStore.getFeatureSource(tname("ft1")).getCount(q)); }
void doTestOuterJoin(boolean exposePrimaryKeys) throws Exception { dataStore.setExposePrimaryKeyColumns(exposePrimaryKeys); FilterFactory ff = dataStore.getFilterFactory(); Query q = new Query(tname("ftjoin")); q.getJoins() .add( new Join( tname("ft1"), ff.equal( ff.property(aname("name")), ff.property(aname("stringProperty")), true)) .type(Type.OUTER)); SimpleFeatureCollection features = dataStore.getFeatureSource(tname("ftjoin")).getFeatures(q); assertEquals( dataStore.getFeatureSource(tname("ftjoin")).getFeatures(q).size(), features.size()); try (SimpleFeatureIterator it = features.features()) { while (it.hasNext()) { SimpleFeature f = it.next(); assertEquals(4 + (exposePrimaryKeys ? 1 : 0), f.getAttributeCount()); SimpleFeature g = (SimpleFeature) f.getAttribute(tname("ft1")); if ("three".equals(f.getAttribute(aname("name")))) { assertNull(g); } else { assertNotNull(g); } } } }
void doTestSimpleJoinWithFilter(boolean exposePrimaryKeys) throws Exception { dataStore.setExposePrimaryKeyColumns(exposePrimaryKeys); FilterFactory ff = dataStore.getFilterFactory(); Query q = new Query(tname("ft1")); q.getJoins() .add( new Join( tname("ftjoin"), ff.equal( ff.property(aname("stringProperty")), ff.property(aname("name")), true))); q.setFilter(ff.equal(ff.property(aname("stringProperty")), ff.literal("two"), true)); SimpleFeatureCollection features = dataStore.getFeatureSource(tname("ft1")).getFeatures(q); assertEquals(1, features.size()); try (SimpleFeatureIterator it = features.features()) { SimpleFeature f = it.next(); assertEquals(5 + (exposePrimaryKeys ? 1 : 0), f.getAttributeCount()); assertEquals(2, ((Number) f.getAttribute(aname("intProperty"))).intValue()); assertEquals("two", f.getAttribute(aname("stringProperty"))); SimpleFeature g = (SimpleFeature) f.getAttribute(aname("ftjoin")); assertEquals(3 + (exposePrimaryKeys ? 1 : 0), g.getAttributeCount()); if (exposePrimaryKeys) { assertEquals(2, ((Number) g.getAttribute(aname("id"))).intValue()); } assertEquals("two", g.getAttribute(aname("name"))); } }
public void doTestSelfJoin(boolean exposePrimaryKeys) throws Exception { dataStore.setExposePrimaryKeyColumns(exposePrimaryKeys); FilterFactory ff = dataStore.getFilterFactory(); Query q = new Query(tname("ft1")); q.getJoins() .add( new Join( tname("ft1"), ff.equal( ff.property(aname("intProperty")), ff.property(aname("foo.intProperty")), true)) .alias(aname("foo"))); q.setFilter(ff.equal(ff.property(aname("stringProperty")), ff.literal("two"), true)); SimpleFeatureCollection features = dataStore.getFeatureSource(tname("ft1")).getFeatures(q); assertEquals(1, features.size()); try (SimpleFeatureIterator it = features.features()) { assertTrue(it.hasNext()); SimpleFeature f = it.next(); assertEquals(5 + (exposePrimaryKeys ? 1 : 0), f.getAttributeCount()); assertEquals(2, ((Number) f.getAttribute(aname("intProperty"))).intValue()); assertEquals("two", f.getAttribute(aname("stringProperty"))); SimpleFeature g = (SimpleFeature) f.getAttribute(aname("foo")); assertEquals(4 + (exposePrimaryKeys ? 1 : 0), g.getAttributeCount()); assertEquals(2, ((Number) g.getAttribute(aname("intProperty"))).intValue()); assertEquals("two", g.getAttribute(aname("stringProperty"))); } }
void doTestSimpleJoinWithFilterNoProperties(boolean exposePrimaryKeys) throws Exception { dataStore.setExposePrimaryKeyColumns(exposePrimaryKeys); FilterFactory ff = dataStore.getFilterFactory(); Query q = new Query(tname("ft1")); Join j = new Join( tname("ftjoin"), ff.equal( ff.property(aname("stringProperty")), ff.property(aname("name")), true)); j.setProperties(Query.NO_PROPERTIES); q.getJoins().add(j); q.setFilter(ff.equal(ff.property(aname("stringProperty")), ff.literal("two"), true)); SimpleFeatureCollection features = dataStore.getFeatureSource(tname("ft1")).getFeatures(q); assertEquals(1, features.size()); try (SimpleFeatureIterator it = features.features()) { SimpleFeature f = it.next(); assertEquals(5 + (exposePrimaryKeys ? 1 : 0), f.getAttributeCount()); assertEquals(2, ((Number) f.getAttribute(aname("intProperty"))).intValue()); assertEquals("two", f.getAttribute(aname("stringProperty"))); SimpleFeature g = (SimpleFeature) f.getAttribute(aname("ftjoin")); assertEquals(0, g.getAttributeCount()); } }
void doTestSimpleJoinWithSort(boolean exposePrimaryKeys) throws Exception { dataStore.setExposePrimaryKeyColumns(exposePrimaryKeys); FilterFactory ff = dataStore.getFilterFactory(); Filter j = ff.equal(ff.property(aname("stringProperty")), ff.property(aname("name")), true); Query q = new Query(tname("ft1")); q.getJoins().add(new Join(tname("ftjoin"), j)); q.setSortBy(new SortBy[] {ff.sort(aname("intProperty"), SortOrder.DESCENDING)}); SimpleFeatureCollection features = dataStore.getFeatureSource(tname("ft1")).getFeatures(q); try (SimpleFeatureIterator it = features.features()) { assertTrue(it.hasNext()); assertEquals("two", it.next().getAttribute(aname("stringProperty"))); assertTrue(it.hasNext()); assertEquals("one", it.next().getAttribute(aname("stringProperty"))); assertTrue(it.hasNext()); assertEquals("zero", it.next().getAttribute(aname("stringProperty"))); } }
void doTestSimpleJoinWithLimitOffset(boolean exposePrimaryKeys) throws Exception { dataStore.setExposePrimaryKeyColumns(exposePrimaryKeys); FilterFactory ff = dataStore.getFilterFactory(); Filter j = ff.equal(ff.property(aname("stringProperty")), ff.property(aname("name")), true); Query q = new Query(tname("ft1")); q.getJoins().add(new Join(tname("ftjoin"), j)); q.setFilter(ff.greater(ff.property(aname("intProperty")), ff.literal(0))); q.setStartIndex(1); q.setSortBy(new SortBy[] {ff.sort(aname("intProperty"), SortOrder.ASCENDING)}); SimpleFeatureCollection features = dataStore.getFeatureSource(tname("ft1")).getFeatures(q); assertEquals(1, features.size()); try (SimpleFeatureIterator it = features.features()) { assertTrue(it.hasNext()); SimpleFeature f = it.next(); assertEquals("two", f.getAttribute(aname("stringProperty"))); SimpleFeature g = (SimpleFeature) f.getAttribute(aname("ftjoin")); assertEquals("two", g.getAttribute(aname("name"))); } }
q.getJoins() .add( new Join(