Making consistent the evaluate method of filters. The evaluate method accepts vector features, making possible logical filters that combine spatial and comparison filters. r=ahocevar (closes #2773)

git-svn-id: http://svn.openlayers.org/trunk/openlayers@10596 dc9f47b5-9b13-0410-9fdd-eb0c1a62fdaf
This commit is contained in:
Tim Schaub
2010-08-05 15:38:55 +00:00
parent c15a1a0779
commit e0c3db1227
6 changed files with 215 additions and 23 deletions
+111 -1
View File
@@ -175,7 +175,117 @@
}
}
function test_evaluate_feature(t) {
var cases = [{
filter: new OpenLayers.Filter.Comparison({
type: OpenLayers.Filter.Comparison.BETWEEN,
property: "area",
lowerBoundary: 1000,
upperBoundary: 4999
}),
context: new OpenLayers.Feature.Vector(null, {area: 999}),
expect: false
}, {
filter: new OpenLayers.Filter.Comparison({
type: OpenLayers.Filter.Comparison.BETWEEN,
property: "area",
lowerBoundary: 1000,
upperBoundary: 4999
}),
context: new OpenLayers.Feature.Vector(null, {area: 1000}),
expect: true
}, {
filter: new OpenLayers.Filter.Comparison({
type: OpenLayers.Filter.Comparison.BETWEEN,
property: "area",
lowerBoundary: 1000,
upperBoundary: 4999
}),
context: new OpenLayers.Feature.Vector(null, {area: 4999}),
expect: true
}, {
filter: new OpenLayers.Filter.Comparison({
type: OpenLayers.Filter.Comparison.BETWEEN,
property: "area",
lowerBoundary: 1000,
upperBoundary: 4999
}),
context: new OpenLayers.Feature.Vector(null, {area: 5000}),
expect: false
}, {
filter: new OpenLayers.Filter.Comparison({
type: OpenLayers.Filter.Comparison.BETWEEN,
property: "area",
lowerBoundary: 1000,
upperBoundary: 4999
}),
context: new OpenLayers.Feature.Vector(null, {area: 999}),
expect: false
}, {
filter: new OpenLayers.Filter.Comparison({
type: OpenLayers.Filter.Comparison.EQUAL_TO,
property: "prop",
value: "Foo"
}),
context: new OpenLayers.Feature.Vector(null, {prop: "Foo"}),
expect: true
}, {
filter: new OpenLayers.Filter.Comparison({
type: OpenLayers.Filter.Comparison.EQUAL_TO,
property: "prop",
value: "Foo"
}),
context: new OpenLayers.Feature.Vector(null, {prop: "foo"}),
expect: false
}, {
filter: new OpenLayers.Filter.Comparison({
type: OpenLayers.Filter.Comparison.EQUAL_TO,
matchCase: true,
property: "prop",
value: "Foo"
}),
context: new OpenLayers.Feature.Vector(null, {prop: "foo"}),
expect: false
}, {
filter: new OpenLayers.Filter.Comparison({
type: OpenLayers.Filter.Comparison.NOT_EQUAL_TO,
property: "prop",
value: "foo"
}),
context: {prop: "FOO"},
expect: true
}, {
filter: new OpenLayers.Filter.Comparison({
type: OpenLayers.Filter.Comparison.NOT_EQUAL_TO,
matchCase: true,
property: "prop",
value: "foo"
}),
context: new OpenLayers.Feature.Vector(null, {prop: "FOO"}),
expect: true
}, {
filter: new OpenLayers.Filter.Comparison({
type: OpenLayers.Filter.Comparison.NOT_EQUAL_TO,
matchCase: false,
property: "prop",
value: "foo"
}),
context: new OpenLayers.Feature.Vector(null, {prop: "FOO"}),
expect: false
}];
t.plan(cases.length);
var c;
for(var i=0; i<cases.length; ++i) {
c = cases[i];
t.eq(c.filter.evaluate(c.context), c.expect, "case " + i + ": " + c.filter.type);
}
}
function test_clone(t) {
t.plan(3);
+69
View File
@@ -35,6 +35,75 @@
"feature evaluates to false correctly.");
}
function test_evaluate_feature(t) {
t.plan(6);
var feature = new OpenLayers.Feature.Vector(null, {
pop: 200,
name: "foo"
});
var smallPop = new OpenLayers.Filter.Comparison({
type: OpenLayers.Filter.Comparison.LESS_THAN,
property: "pop",
value: 120
});
var bigPop = new OpenLayers.Filter.Comparison({
type: OpenLayers.Filter.Comparison.GREATER_THAN,
property: "pop",
value: 120
});
var namedFoo = new OpenLayers.Filter.Comparison({
type: OpenLayers.Filter.Comparison.EQUAL_TO,
property: "name",
value: "foo"
});
var filter;
// test simple not
filter = new OpenLayers.Filter.Logical({
type: OpenLayers.Filter.Logical.NOT,
filters: [smallPop]
});
t.eq(filter.evaluate(feature), true, "not smallPop");
filter = new OpenLayers.Filter.Logical({
type: OpenLayers.Filter.Logical.NOT,
filters: [bigPop]
});
t.eq(filter.evaluate(feature), false, "not bigPop");
// test or
filter = new OpenLayers.Filter.Logical({
type: OpenLayers.Filter.Logical.OR,
filters: [smallPop, namedFoo]
});
t.eq(filter.evaluate(feature), true, "smallPop or namedFoo");
filter = new OpenLayers.Filter.Logical({
type: OpenLayers.Filter.Logical.OR,
filters: [bigPop, namedFoo]
});
t.eq(filter.evaluate(feature), true, "bigPop or namedFoo");
// test and
filter = new OpenLayers.Filter.Logical({
type: OpenLayers.Filter.Logical.AND,
filters: [smallPop, namedFoo]
});
t.eq(filter.evaluate(feature), false, "smallPop and namedFoo");
filter = new OpenLayers.Filter.Logical({
type: OpenLayers.Filter.Logical.AND,
filters: [bigPop, namedFoo]
});
t.eq(filter.evaluate(feature), true, "bigPop and namedFoo");
}
function test_clone(t) {
t.plan(2);
+15 -6
View File
@@ -23,7 +23,7 @@
}
function test_evaluate(t) {
t.plan(4);
t.plan(8);
var filer, feature, res, geom, bounds;
@@ -33,21 +33,25 @@
value: bounds
});
// 1 test
var not = new OpenLayers.Filter.Logical({
type: OpenLayers.Filter.Logical.NOT,
filters: [filter]
});
feature = new OpenLayers.Feature.Vector(
new OpenLayers.Geometry.Point(2, 2));
res = filter.evaluate(feature);
t.eq(res, true,
"evaluates returns correct value when feature intersects bounds");
// 1 test
t.eq(not.evaluate(feature), !res, "not bbox");
feature = new OpenLayers.Feature.Vector(
new OpenLayers.Geometry.Point(20, 20));
res = filter.evaluate(feature);
t.eq(res, false,
"evaluates returns correct value when feature does not intersect bounds");
t.eq(not.evaluate(feature), !res, "not outside bbox");
// 1 test
geom = bounds.toGeometry();
feature = new OpenLayers.Feature.Vector(
new OpenLayers.Geometry.Point(2, 2));
@@ -58,8 +62,9 @@
res = filter.evaluate(feature);
t.eq(res, true,
"evaluates returns correct value when feature intersects bounds");
not.filters = [filter];
t.eq(not.evaluate(feature), !res, "not intersection");
// 1 test
geom = bounds.toGeometry();
feature = new OpenLayers.Feature.Vector(
new OpenLayers.Geometry.Point(20, 20));
@@ -67,9 +72,13 @@
type: OpenLayers.Filter.Spatial.INTERSECTS,
value: geom
});
not.filters = [filter];
res = filter.evaluate(feature);
t.eq(res, false,
"evaluates returns correct value when feature does not intersect bounds");
t.eq(not.evaluate(feature), !res, "not non-intersection");
}
function test_clone(t) {