You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by ko...@apache.org on 2015/04/24 00:12:59 UTC

[14/17] cayenne git commit: CAY-2003 cdbimport doesn't work properly with several includeTable tags

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f438729f/cayenne-server/src/test/java/org/apache/cayenne/access/DbLoaderIT.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/DbLoaderIT.java b/cayenne-server/src/test/java/org/apache/cayenne/access/DbLoaderIT.java
index b6ba66e..a9f4e5b 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/access/DbLoaderIT.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/access/DbLoaderIT.java
@@ -22,8 +22,12 @@ package org.apache.cayenne.access;
 import java.sql.Types;
 import java.util.Collection;
 import java.util.List;
+import java.util.Map;
 
 import org.apache.cayenne.access.loader.DbLoaderConfiguration;
+import org.apache.cayenne.access.loader.filters.FiltersConfig;
+import org.apache.cayenne.access.loader.filters.PatternFilter;
+import org.apache.cayenne.access.loader.filters.TableFilter;
 import org.apache.cayenne.configuration.server.ServerRuntime;
 import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.dba.TypesMapping;
@@ -43,10 +47,6 @@ import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 
-import java.sql.Types;
-import java.util.Collection;
-import java.util.List;
-
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
@@ -104,13 +104,13 @@ public class DbLoaderIT extends ServerCase {
 
         String tableLabel = adapter.tableTypeForTable();
 
-        List<DbEntity> tables = loader.getTables(new DbLoaderConfiguration(), new String[] { tableLabel });
+        Map<DbEntity, PatternFilter> tables = loader.getTables(new DbLoaderConfiguration(), new String[]{tableLabel});
 
         assertNotNull(tables);
 
         boolean foundArtist = false;
 
-        for (DbEntity table : tables) {
+        for (DbEntity table : tables.keySet()) {
             if ("ARTIST".equalsIgnoreCase(table.getName())) {
                 foundArtist = true;
                 break;
@@ -121,6 +121,34 @@ public class DbLoaderIT extends ServerCase {
     }
 
     @Test
+    public void testGetTablesWithWrongCatalog() throws Exception {
+
+        DbLoaderConfiguration config = new DbLoaderConfiguration();
+        config.setFiltersConfig(
+                FiltersConfig.create("WRONG", null, TableFilter.everything(), PatternFilter.INCLUDE_NOTHING));
+        Map<DbEntity, PatternFilter> tables = loader.getTables(
+                config,
+                new String[]{ adapter.tableTypeForTable()});
+
+        assertNotNull(tables);
+        assertTrue(tables.isEmpty());
+    }
+
+    @Test
+    public void testGetTablesWithWrongSchema() throws Exception {
+
+        DbLoaderConfiguration config = new DbLoaderConfiguration();
+        config.setFiltersConfig(
+                FiltersConfig.create(null, "WRONG", TableFilter.everything(), PatternFilter.INCLUDE_NOTHING));
+        Map<DbEntity, PatternFilter> tables = loader.getTables(
+                config,
+                new String[]{ adapter.tableTypeForTable()});
+
+        assertNotNull(tables);
+        assertTrue(tables.isEmpty());
+    }
+
+    @Test
     public void testLoadWithMeaningfulPK() throws Exception {
 
         DataMap map = new DataMap();
@@ -128,12 +156,12 @@ public class DbLoaderIT extends ServerCase {
 
         loader.setCreatingMeaningfulPK(true);
 
-        List<DbEntity> testLoader = loader.getTables(CONFIG, tableLabel);
+        Map<DbEntity, PatternFilter> testLoader = loader.getTables(CONFIG, tableLabel);
         if (testLoader.isEmpty()) {
             testLoader = loader.getTables(CONFIG, tableLabel);
         }
 
-        List<DbEntity> entities = loader.loadDbEntities(map, CONFIG, testLoader);
+        List<DbEntity> entities = loader.loadDbEntities(map, testLoader, CONFIG);
         loader.loadObjEntities(map, CONFIG, entities);
 
         ObjEntity artist = map.getObjEntity("Artist");
@@ -162,7 +190,7 @@ public class DbLoaderIT extends ServerCase {
         String tableLabel = adapter.tableTypeForTable();
 
         // *** TESTING THIS ***
-        List<DbEntity> entities = loader.loadDbEntities(map, CONFIG, loader.getTables(CONFIG, new String[]{tableLabel}));
+        List<DbEntity> entities = loader.loadDbEntities(map, loader.getTables(CONFIG, new String[]{tableLabel}), CONFIG);
 
         assertDbEntities(map);
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f438729f/cayenne-server/src/test/java/org/apache/cayenne/access/DbLoaderPartialIT.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/DbLoaderPartialIT.java b/cayenne-server/src/test/java/org/apache/cayenne/access/DbLoaderPartialIT.java
index 2a56b88..9f23aba 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/access/DbLoaderPartialIT.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/access/DbLoaderPartialIT.java
@@ -81,9 +81,7 @@ public class DbLoaderPartialIT extends ServerCase {
         DataMap map = new DataMap();
         String tableLabel = adapter.tableTypeForTable();
 
-        loader.loadDataMapFromDB(null, "%", new String[] {
-            tableLabel
-        }, map);
+        loader.loadDataMapFromDB(null, "%", new String[] {tableLabel}, map);
 
         Collection<?> rels = getDbEntity(map, "ARTIST").getRelationships();
         assertNotNull(rels);

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f438729f/cayenne-server/src/test/java/org/apache/cayenne/access/loader/filters/DbPathTest.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/loader/filters/DbPathTest.java b/cayenne-server/src/test/java/org/apache/cayenne/access/loader/filters/DbPathTest.java
deleted file mode 100644
index 60d4933..0000000
--- a/cayenne-server/src/test/java/org/apache/cayenne/access/loader/filters/DbPathTest.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- *    or more contributor license agreements.  See the NOTICE file
- *    distributed with this work for additional information
- *    regarding copyright ownership.  The ASF licenses this file
- *    to you under the Apache License, Version 2.0 (the
- *    "License"); you may not use this file except in compliance
- *    with the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *    Unless required by applicable law or agreed to in writing,
- *    software distributed under the License is distributed on an
- *    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *    KIND, either express or implied.  See the License for the
- *    specific language governing permissions and limitations
- *    under the License.
- */
-
-package org.apache.cayenne.access.loader.filters;
-
-import org.junit.Test;
-
-import static org.apache.cayenne.access.loader.filters.FiltersFactory.path;
-import static org.junit.Assert.*;
-
-public class DbPathTest {
-
-    @Test
-    public void testIsCover() throws Exception {
-        assertTrue(path(null, null).isCover(path("Hello", "World")));
-        assertTrue(path(null, null).isCover(path("Hello", null)));
-        assertTrue(path(null, null).isCover(path(null, null)));
-        assertTrue(path(null, "Yo").isCover(path("Yo!", "Yo")));
-        assertTrue(path(null, "Yo").isCover(path(null, "Yo")));
-
-        assertFalse(path(null, "Yo!").isCover(path(null, "Yo!!")));
-        assertFalse(path("aa", "Yo!").isCover(path(null, "Yo!!")));
-        assertFalse(path("aaa", "Yo!").isCover(path("aa", "Yo!!")));
-
-        assertTrue(path("aa", null).isCover(path("aa", null)));
-        assertTrue(path("aa", null).isCover(path("aa", "bb")));
-        assertTrue(path("aa", "Yo!").isCover(path("aa", "Yo!")));
-        assertFalse(path("aa", "Yo!").isCover(path("aa", "Yo!!")));
-
-        assertFalse(path("", "APP").isCover(path(null, null)));
-
-        assertTrue(path(null, "schema_01").isCover(path("", "schema_01")));
-        assertTrue(path(null, "schema_01").isCover(path(null, "schema_01")));
-        assertFalse(path(null, "schema_01").isCover(path("", "schema_02")));
-        assertFalse(path(null, "schema_02").isCover(path("", "schema_01")));
-    }
-
-    @Test
-    public void testToString() throws Exception {
-        assertEquals("%", path(null, null).toString());
-        assertEquals("/schema", path("", "schema").toString());
-        assertEquals("%/schema", path(null, "schema").toString());
-        assertEquals("catalog/schema", path("catalog", "schema").toString());
-        assertEquals("catalog//table", path("catalog", "", "table").toString());
-        assertEquals("catalog/%/table", path("catalog", null, "table").toString());
-        assertEquals("//table", path("", "", "table").toString());
-        assertEquals("%/%/table", path(null, null, "table").toString());
-        assertEquals("%", path(null, null, null).toString());
-        assertEquals("c/%/", path("c", null, "").toString());
-    }
-
-    @Test
-    public void testMerge() throws Exception {
-        DbPath path1 = path(null, null);
-        DbPath path2 = path("", "APP");
-        assertEquals(path1, path1.merge(path2));
-        assertEquals(path1, path2.merge(path1));
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f438729f/cayenne-server/src/test/java/org/apache/cayenne/access/loader/filters/EntityFiltersTest.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/loader/filters/EntityFiltersTest.java b/cayenne-server/src/test/java/org/apache/cayenne/access/loader/filters/EntityFiltersTest.java
deleted file mode 100644
index 5b936ac..0000000
--- a/cayenne-server/src/test/java/org/apache/cayenne/access/loader/filters/EntityFiltersTest.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- *    or more contributor license agreements.  See the NOTICE file
- *    distributed with this work for additional information
- *    regarding copyright ownership.  The ASF licenses this file
- *    to you under the Apache License, Version 2.0 (the
- *    "License"); you may not use this file except in compliance
- *    with the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *    Unless required by applicable law or agreed to in writing,
- *    software distributed under the License is distributed on an
- *    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *    KIND, either express or implied.  See the License for the
- *    specific language governing permissions and limitations
- *    under the License.
- */
-
-package org.apache.cayenne.access.loader.filters;
-
-import org.junit.Test;
-
-import static org.apache.cayenne.access.loader.filters.FilterFactory.*;
-import static org.junit.Assert.*;
-
-public class EntityFiltersTest {
-
-    @Test
-    public void testJoinWithEmpty() throws Exception {
-        EntityFilters filter1 = new EntityFilters(null, null, null, null);
-        EntityFilters filter2 = new EntityFilters(null, include("table"), include("column"), include("procedure"));
-
-        assertEquals(filter2, filter1.join(filter2));
-        assertEquals(filter2, filter2.join(filter1));
-    }
-
-    @Test
-    public void testJoinExcludeInclude() throws Exception {
-        EntityFilters filter1 = new EntityFilters(null, exclude("table"), exclude("column"), exclude("procedure"));
-        EntityFilters filter2 = new EntityFilters(null, include("table"), include("column"), include("procedure"));
-
-        assertEquals(new EntityFilters(null,
-                        list(exclude("table"), include("table")),
-                        list(exclude("column"), include("column")),
-                        list(exclude("procedure"), include("procedure"))),
-                filter1.join(filter2));
-        assertEquals(new EntityFilters(null,
-                        list(include("table"), exclude("table")),
-                        list(include("column"), exclude("column")),
-                        list(include("procedure"), exclude("procedure"))),
-                filter2.join(filter1));
-    }
-
-    @Test
-    public void testEquals() throws Exception {
-        EntityFilters filters = new EntityFilters(new DbPath(), NULL, NULL, NULL);
-        assertTrue(filters.tableFilter().equals(NULL));
-        assertTrue(filters.columnFilter().equals(NULL));
-        assertTrue(filters.procedureFilter().equals(NULL));
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f438729f/cayenne-server/src/test/java/org/apache/cayenne/access/loader/filters/FiltersConfigTest.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/loader/filters/FiltersConfigTest.java b/cayenne-server/src/test/java/org/apache/cayenne/access/loader/filters/FiltersConfigTest.java
index c6097ec..26501fc 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/access/loader/filters/FiltersConfigTest.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/access/loader/filters/FiltersConfigTest.java
@@ -1,198 +1,74 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- *    or more contributor license agreements.  See the NOTICE file
- *    distributed with this work for additional information
- *    regarding copyright ownership.  The ASF licenses this file
- *    to you under the Apache License, Version 2.0 (the
- *    "License"); you may not use this file except in compliance
- *    with the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *    Unless required by applicable law or agreed to in writing,
- *    software distributed under the License is distributed on an
- *    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *    KIND, either express or implied.  See the License for the
- *    specific language governing permissions and limitations
- *    under the License.
- */
-
 package org.apache.cayenne.access.loader.filters;
 
-import org.junit.Test;
-
-import java.util.Iterator;
-import java.util.List;
+import junit.framework.TestCase;
 
-import static org.apache.cayenne.access.loader.filters.FilterFactory.*;
-import static org.apache.cayenne.access.loader.filters.FiltersFactory.path;
-import static org.apache.cayenne.access.loader.filters.FiltersFactory.eFilters;
-import static org.junit.Assert.*;
+import java.util.Collections;
+import java.util.SortedSet;
+import java.util.TreeSet;
+import java.util.regex.Pattern;
 
-public class FiltersConfigTest {
+public class FiltersConfigTest extends TestCase {
 
-    @Test
-    public void testSorting() throws Exception {
-        FiltersConfig filters = new FiltersConfig(
-                entityFilter("", ""),
-                entityFilter("aaa", ""),
-                entityFilter("aa", ""),
-                entityFilter("aa", "a"),
-                entityFilter("aa", "aa"),
-                entityFilter("aa", "aa"),
-                entityFilter("b", "b")
-        );
-
-        Iterator<DbPath> iterator = filters.getDbPaths().iterator();
-        assertEquals(path("", ""), iterator.next());
-        assertEquals(path("aa", ""), iterator.next());
-        assertEquals(path("aa", "a"), iterator.next());
-        assertEquals(path("aa", "aa"), iterator.next());
-        assertEquals(path("aaa", ""), iterator.next());
-        assertEquals(path("b", "b"), iterator.next());
-    }
+    public void testToString_01() {
+        FiltersConfig config = FiltersConfig.create(null, null,
+                TableFilter.everything(), PatternFilter.INCLUDE_EVERYTHING);
 
-    private EntityFilters entityFilter(String s, String s1) {
-        return new EntityFilters(new DbPath(s, s1), include("IncludeTable"), TRUE, TRUE);
+        assertEquals("Catalog: null\n" +
+                     "  Schema: null\n" +
+                     "    Tables: \n" +
+                     "      Include: null Columns: ALL\n" +
+                     "    Procedures: ALL\n", config.toString());
     }
 
-    @Test
-    public void testActionsWithEmptyCatalog() throws Exception {
-        FiltersConfig filters = new FiltersConfig(
-                entityFilter(null, null),
-                entityFilter("aaa", null),
-                entityFilter("aa", null)
+    public void testToString_02() {
+        FiltersConfig config = new FiltersConfig(
+                new CatalogFilter("catalog_01",
+                        new SchemaFilter("schema_11", TableFilter.everything(), PatternFilter.INCLUDE_EVERYTHING)),
+                new CatalogFilter("catalog_02",
+                        new SchemaFilter("schema_21", TableFilter.everything(), PatternFilter.INCLUDE_NOTHING),
+                        new SchemaFilter("schema_22",
+                                new TableFilter(
+                                        includes(new IncludeTableFilter(null, PatternFilter.INCLUDE_NOTHING)),
+                                        excludes("aaa")),
+                                PatternFilter.INCLUDE_NOTHING),
+                        new SchemaFilter("schema_23", TableFilter.include("include"), PatternFilter.INCLUDE_NOTHING)
+                )
         );
 
-        List<DbPath> actions = filters.pathsForQueries();
-        assertEquals(1L, actions.size());
-        assertEquals(path(), actions.get(0));
+        assertEquals("Catalog: catalog_01\n" +
+                     "  Schema: schema_11\n" +
+                     "    Tables: \n" +
+                     "      Include: null Columns: ALL\n" +
+                     "    Procedures: ALL\n" +
+                     "Catalog: catalog_02\n" +
+                     "  Schema: schema_21\n" +
+                     "    Tables: \n" +
+                     "      Include: null Columns: ALL\n" +
+                     "    Procedures: NONE\n" +
+                     "  Schema: schema_22\n" +
+                     "    Tables: \n" +
+                     "      Include: null Columns: NONE\n" +
+                     "      aaa\n" +
+                     "    Procedures: NONE\n" +
+                     "  Schema: schema_23\n" +
+                     "    Tables: \n" +
+                     "      Include: include Columns: ALL\n" +
+                     "    Procedures: NONE\n", config.toString());
     }
 
-    @Test
-    public void testActionsWithEmptySchemas() throws Exception {
-        FiltersConfig filters = new FiltersConfig(
-                entityFilter("aaa", null),
-                entityFilter("aaa", "11"),
-                entityFilter("aa", null),
-                entityFilter("aa", "a"),
-                entityFilter("aa", "aa"),
-                entityFilter("aa", "aa")
-        );
-
-
-        List<DbPath> actions = filters.pathsForQueries();
-        assertEquals(2L, actions.size());
-        assertEquals(path("aa", null), actions.get(0));
-        assertEquals(path("aaa", null), actions.get(1));
+    private SortedSet<Pattern> excludes(String ... p) {
+        SortedSet<Pattern> patterns = new TreeSet<Pattern>(PatternFilter.PATTERN_COMPARATOR);
+        for (String pattern : p) {
+            patterns.add(PatternFilter.pattern(pattern));
+        }
+        return patterns;
     }
 
-    @Test
-    public void testActionsWithSchemas() throws Exception {
-        FiltersConfig filters = new FiltersConfig(
-                entityFilter("aaa", ""),
-                entityFilter("aa", "a"),
-                entityFilter("aa", "aa"),
-                entityFilter("aa", "aa"),
-                entityFilter("aa", "b"),
-                entityFilter("aa", "b"),
-                entityFilter("aa", "b")
-        );
-
+    protected SortedSet<IncludeTableFilter> includes(IncludeTableFilter ... filters) {
+        SortedSet<IncludeTableFilter> includeTableFilters = new TreeSet<IncludeTableFilter>();
+        Collections.addAll(includeTableFilters, filters);
 
-        List<DbPath> actions = filters.pathsForQueries();
-        assertEquals(4L, actions.size());
-        assertEquals(path("aa", "a"), actions.get(0));
-        assertEquals(path("aa", "aa"), actions.get(1));
-        assertEquals(path("aa", "b"), actions.get(2));
-        assertEquals(path("aaa", ""), actions.get(3));
+        return includeTableFilters;
     }
 
-    @Test
-    public void testActionsWithSchemasAndEmptyCatalog() throws Exception {
-        FiltersConfig filters = new FiltersConfig(
-                entityFilter("", "a"),
-                entityFilter("", "aa"),
-                entityFilter("", "aa"),
-                entityFilter("", "b"),
-                entityFilter("", "b"),
-                entityFilter("", "b")
-        );
-
-
-        List<DbPath> actions = filters.pathsForQueries();
-        assertEquals(3L, actions.size());
-        assertEquals(path("", "b"), actions.get(2));
-        assertEquals(path("", "aa"), actions.get(1));
-        assertEquals(path("", "a"), actions.get(0));
-
-    }
-
-    @Test
-    public void testFiltersOneFilter() throws Exception {
-        FiltersConfig filters = new FiltersConfig(
-                eFilters(path("", "a"), include("table")),
-                entityFilter("", "aa"),
-                entityFilter("", "aa"),
-                entityFilter("", "b"),
-                entityFilter("", "b"),
-                entityFilter("", "b")
-        );
-
-        assertEquals(eFilters(path("", "a"), include("table")),
-                     filters.filter(path("", "a")));
-    }
-
-    @Test
-    public void testFiltersJoinFilters() throws Exception {
-        FiltersConfig filters = new FiltersConfig(
-                eFilters(path("", "a"), include("table")),
-                eFilters(path("", "a"), exclude("table")),
-                entityFilter("", "aa"),
-                entityFilter("", "aa")
-        );
-
-        assertEquals(eFilters(path("", "a"), list(include("table"), exclude("table"))),
-                filters.filter(path("", "a")));
-
-        assertEquals(entityFilter("", "aa"), filters.filter(path("", "aa")));
-    }
-
-    @Test
-    public void testFiltersJoinFiltersWithNull() throws Exception {
-        FiltersConfig filters = new FiltersConfig(
-                eFilters(path("", "a"), include("table")),
-                eFilters(path("", "a"), exclude("table")),
-                eFilters(path("", "a"), null)
-        );
-
-        assertEquals(eFilters(path("", "a"), list(include("table"), exclude("table"))),
-                     filters.filter(path("", "a")));
-    }
-
-    @Test
-    public void testFiltersTopLevelTables() throws Exception {
-        FiltersConfig filters = new FiltersConfig(
-            eFilters(path(null, null), include("TableName"))
-        );
-
-        assertEquals(eFilters(path(null, null), include("TableName")),
-                     filters.filter(path("", "APP")));
-    }
-
-    @Test
-    public void testFiltersFor2Schemas() throws Exception {
-        FiltersConfig filters = new FiltersConfig(
-                eFilters(path(null, "schema_01"), include("TableName_01")),
-                eFilters(path(null, "schema_02"), include("TableName_01"))
-        );
-
-        assertEquals(
-                eFilters(path(null, "schema_01"), include("TableName_01")),
-                filters.filter(path("", "schema_01")));
-
-        assertEquals("In case we don't have filter that cover path we should return null filter ",
-                eFilters(path("", "app"), null),
-                filters.filter(path("", "app")));
-    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f438729f/cayenne-server/src/test/java/org/apache/cayenne/access/loader/filters/FiltersFactory.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/loader/filters/FiltersFactory.java b/cayenne-server/src/test/java/org/apache/cayenne/access/loader/filters/FiltersFactory.java
deleted file mode 100644
index 1ef7428..0000000
--- a/cayenne-server/src/test/java/org/apache/cayenne/access/loader/filters/FiltersFactory.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- *    or more contributor license agreements.  See the NOTICE file
- *    distributed with this work for additional information
- *    regarding copyright ownership.  The ASF licenses this file
- *    to you under the Apache License, Version 2.0 (the
- *    "License"); you may not use this file except in compliance
- *    with the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *    Unless required by applicable law or agreed to in writing,
- *    software distributed under the License is distributed on an
- *    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *    KIND, either express or implied.  See the License for the
- *    specific language governing permissions and limitations
- *    under the License.
- */
-package org.apache.cayenne.access.loader.filters;
-
-/**
- * @since 3.2.
- */
-public class FiltersFactory {
-
-    public static DbPath path(String catalog, String schema, String table) {
-        return new DbPath(catalog, schema, table);
-    }
-
-    public static DbPath path(String catalog, String schema) {
-        return new DbPath(catalog, schema);
-    }
-
-    public static DbPath path() {
-        return new DbPath();
-    }
-
-    public static EntityFilters eFilters(DbPath path, Filter<String> tableFilter) {
-        return new EntityFilters(path, tableFilter, null, null);
-    }
-    public static EntityFilters eFilters(DbPath path, Filter<String> table, Filter<String> column, Filter<String> proc) {
-        return new EntityFilters(path, table, column, proc);
-    }
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f438729f/cayenne-server/src/test/java/org/apache/cayenne/access/loader/filters/IncludeFilterTest.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/loader/filters/IncludeFilterTest.java b/cayenne-server/src/test/java/org/apache/cayenne/access/loader/filters/IncludeFilterTest.java
index 2208c5c..c8cbe5b 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/access/loader/filters/IncludeFilterTest.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/access/loader/filters/IncludeFilterTest.java
@@ -21,17 +21,14 @@ package org.apache.cayenne.access.loader.filters;
 
 import org.junit.Test;
 
-import static org.apache.cayenne.access.loader.filters.FilterFactory.pattern;
-import static org.junit.Assert.*;
-
 public class IncludeFilterTest {
 
     @Test
     public void testIsInclude() throws Exception {
-        IncludeFilter filter = new IncludeFilter(pattern("^v_.*$"));
-        assertTrue(filter.isInclude("v_new_view"));
-        assertFalse(filter.isInclude("new_view"));
-        assertFalse(filter.isInclude("view"));
-        assertFalse(filter.isInclude("girl"));
+//        IncludeFilter filter = new IncludeFilter(pattern("^v_.*$"));
+//        assertTrue(filter.isInclude("v_new_view"));
+//        assertFalse(filter.isInclude("new_view"));
+//        assertFalse(filter.isInclude("view"));
+//        assertFalse(filter.isInclude("girl"));
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f438729f/cayenne-server/src/test/java/org/apache/cayenne/access/loader/filters/PatternFilterTest.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/loader/filters/PatternFilterTest.java b/cayenne-server/src/test/java/org/apache/cayenne/access/loader/filters/PatternFilterTest.java
new file mode 100644
index 0000000..5bd07d4
--- /dev/null
+++ b/cayenne-server/src/test/java/org/apache/cayenne/access/loader/filters/PatternFilterTest.java
@@ -0,0 +1,78 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
+package org.apache.cayenne.access.loader.filters;
+
+import junit.framework.TestCase;
+
+public class PatternFilterTest extends TestCase {
+
+    public void testInclude() throws Exception {
+        PatternFilter filter = new PatternFilter()
+                .include("aaa")
+                .include("bbb");
+
+        assertTrue(filter.isInclude("aaa"));
+        assertTrue(filter.isInclude("bbb"));
+        assertFalse(filter.isInclude("aaaa"));
+        assertFalse(filter.isInclude("aa"));
+        assertFalse(filter.isInclude("abb"));
+
+        filter = new PatternFilter().include("^v_.*$");
+        assertTrue(filter.isInclude("v_new_view"));
+        assertFalse(filter.isInclude("new_view"));
+        assertFalse(filter.isInclude("view"));
+        assertFalse(filter.isInclude("girl"));
+    }
+
+    public void testExclude() throws Exception {
+        PatternFilter filter = new PatternFilter()
+                .exclude("aaa")
+                .exclude("bbb");
+
+        assertFalse(filter.isInclude("aaa"));
+        assertFalse(filter.isInclude("bbb"));
+        assertTrue(filter.isInclude("aaaa"));
+        assertTrue(filter.isInclude("aa"));
+        assertTrue(filter.isInclude("abb"));
+    }
+
+    public void testIncludeExclude() throws Exception {
+        PatternFilter filter = new PatternFilter()
+                .include("aa.*")
+                .exclude("aaa");
+
+        assertFalse(filter.isInclude("aaa"));
+        assertFalse(filter.isInclude("bbb"));
+        assertTrue(filter.isInclude("aaaa"));
+        assertTrue(filter.isInclude("aa"));
+        assertFalse(filter.isInclude("abb"));
+    }
+
+    public void testIncludeAllFilter() {
+        assertTrue(PatternFilter.INCLUDE_EVERYTHING.isInclude("qwe"));
+        assertTrue(PatternFilter.INCLUDE_EVERYTHING.isInclude(""));
+        assertTrue(PatternFilter.INCLUDE_EVERYTHING.isInclude(null));
+    }
+
+    public void testIncludeNoneFilter() {
+        assertFalse(PatternFilter.INCLUDE_NOTHING.isInclude("qwe"));
+        assertFalse(PatternFilter.INCLUDE_NOTHING.isInclude(""));
+        assertFalse(PatternFilter.INCLUDE_NOTHING.isInclude(null));
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f438729f/cayenne-server/src/test/java/org/apache/cayenne/access/loader/filters/TableFilterTest.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/loader/filters/TableFilterTest.java b/cayenne-server/src/test/java/org/apache/cayenne/access/loader/filters/TableFilterTest.java
new file mode 100644
index 0000000..4fad476
--- /dev/null
+++ b/cayenne-server/src/test/java/org/apache/cayenne/access/loader/filters/TableFilterTest.java
@@ -0,0 +1,91 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
+package org.apache.cayenne.access.loader.filters;
+
+import junit.framework.TestCase;
+
+import java.util.TreeSet;
+import java.util.regex.Pattern;
+
+public class TableFilterTest extends TestCase {
+
+    public void testIncludeEverything() {
+        TableFilter filter = TableFilter.everything();
+
+        assertNotNull(filter.isIncludeTable("table"));
+        assertNotNull(filter.isIncludeTable("aaaa"));
+        assertNotNull(filter.isIncludeTable(""));
+        assertNotNull(filter.isIncludeTable("alex"));
+    }
+
+    public void testInclude() {
+        TreeSet<IncludeTableFilter> includes = new TreeSet<IncludeTableFilter>();
+        includes.add(new IncludeTableFilter("aaa"));
+        includes.add(new IncludeTableFilter("bb"));
+
+        TableFilter filter = new TableFilter(includes, new TreeSet<Pattern>(PatternFilter.PATTERN_COMPARATOR));
+
+        assertNotNull(filter.isIncludeTable("aaa"));
+        assertNull(filter.isIncludeTable("aa"));
+        assertNull(filter.isIncludeTable("aaaa"));
+
+        assertNotNull(filter.isIncludeTable("bb"));
+        assertNull(filter.isIncludeTable(""));
+        assertNull(filter.isIncludeTable("bbbb"));
+    }
+
+
+    public void testExclude() {
+        TreeSet<Pattern> excludes = new TreeSet<Pattern>(PatternFilter.PATTERN_COMPARATOR);
+        excludes.add(Pattern.compile("aaa"));
+        excludes.add(Pattern.compile("bb"));
+
+        TreeSet<IncludeTableFilter> includes = new TreeSet<IncludeTableFilter>();
+        includes.add(new IncludeTableFilter(null, PatternFilter.INCLUDE_EVERYTHING));
+
+        TableFilter filter = new TableFilter(includes, excludes);
+
+        assertNull(filter.isIncludeTable("aaa"));
+        assertNotNull(filter.isIncludeTable("aa"));
+        assertNotNull(filter.isIncludeTable("aaaa"));
+
+        assertNull(filter.isIncludeTable("bb"));
+        assertNotNull(filter.isIncludeTable(""));
+        assertNotNull(filter.isIncludeTable("bbbb"));
+    }
+
+    public void testIncludeExclude() {
+        TreeSet<Pattern> excludes = new TreeSet<Pattern>(PatternFilter.PATTERN_COMPARATOR);
+        excludes.add(Pattern.compile("aaa"));
+        excludes.add(Pattern.compile("bb"));
+
+        TreeSet<IncludeTableFilter> includes = new TreeSet<IncludeTableFilter>();
+        includes.add(new IncludeTableFilter("aa.*"));
+
+        TableFilter filter = new TableFilter(includes, excludes);
+
+        assertNull(filter.isIncludeTable("aaa"));
+        assertNotNull(filter.isIncludeTable("aa"));
+        assertNotNull(filter.isIncludeTable("aaaa"));
+
+        assertNull(filter.isIncludeTable("bb"));
+        assertNull(filter.isIncludeTable(""));
+        assertNull(filter.isIncludeTable("bbbb"));
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f438729f/cayenne-tools/src/main/java/org/apache/cayenne/tools/DbImporterTask.java
----------------------------------------------------------------------
diff --git a/cayenne-tools/src/main/java/org/apache/cayenne/tools/DbImporterTask.java b/cayenne-tools/src/main/java/org/apache/cayenne/tools/DbImporterTask.java
index 9cac30b..07eebc7 100644
--- a/cayenne-tools/src/main/java/org/apache/cayenne/tools/DbImporterTask.java
+++ b/cayenne-tools/src/main/java/org/apache/cayenne/tools/DbImporterTask.java
@@ -20,8 +20,7 @@ package org.apache.cayenne.tools;
 
 import java.io.File;
 
-import org.apache.cayenne.access.loader.filters.EntityFilters;
-import org.apache.cayenne.access.loader.filters.FilterFactory;
+import org.apache.cayenne.access.loader.filters.OldFilterConfigBridge;
 import org.apache.cayenne.conn.DataSourceInfo;
 import org.apache.cayenne.tools.dbimport.config.Catalog;
 import org.apache.cayenne.tools.dbimport.config.ExcludeColumn;
@@ -51,7 +50,7 @@ public class DbImporterTask extends Task {
 
     private final ReverseEngineering reverseEngineering = new ReverseEngineering();
 
-    private final EntityFilters.Builder filterBuilder = new EntityFilters.Builder();
+    private final OldFilterConfigBridge filterBuilder = new OldFilterConfigBridge();
 
     public DbImporterTask() {
         config = new DbImportConfiguration();
@@ -64,7 +63,7 @@ public class DbImporterTask extends Task {
     public void execute() {
 
         config.setFiltersConfig(new FiltersConfigBuilder(reverseEngineering)
-                .add(filterBuilder.build())
+                .add(filterBuilder)
                 .filtersConfig());
 
         validateAttributes();
@@ -151,7 +150,7 @@ public class DbImporterTask extends Task {
     }
 
     public void setImportProcedures(boolean importProcedures) {
-        filterBuilder.setProceduresFilters(importProcedures ? FilterFactory.TRUE : FilterFactory.NULL);
+        filterBuilder.setProceduresFilters(importProcedures);
     }
 
     public void setProcedurePattern(String procedurePattern) {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f438729f/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DbImportConfiguration.java
----------------------------------------------------------------------
diff --git a/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DbImportConfiguration.java b/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DbImportConfiguration.java
index 35fba65..ee39060 100644
--- a/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DbImportConfiguration.java
+++ b/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/DbImportConfiguration.java
@@ -24,7 +24,7 @@ import org.apache.cayenne.access.loader.DbLoaderConfiguration;
 import org.apache.cayenne.access.DbLoaderDelegate;
 import org.apache.cayenne.access.loader.DefaultDbLoaderDelegate;
 import org.apache.cayenne.access.loader.NameFilter;
-import org.apache.cayenne.access.loader.filters.DbPath;
+import org.apache.cayenne.access.loader.filters.CatalogFilter;
 import org.apache.cayenne.access.loader.filters.FiltersConfig;
 import org.apache.cayenne.configuration.DataNodeDescriptor;
 import org.apache.cayenne.conn.DataSourceInfo;
@@ -256,12 +256,12 @@ public class DbImportConfiguration {
             dataMap.setDefaultPackage(defaultPackage);
         }
 
-        List<DbPath> dbPaths = dbLoaderConfiguration.getFiltersConfig().getDbPaths();
-        if (!dbPaths.isEmpty()) {
+        CatalogFilter[] catalogs = dbLoaderConfiguration.getFiltersConfig().catalogs;
+        if (catalogs.length > 0) {
             // do not override default catalog of existing DataMap unless it is
             // explicitly requested by the plugin caller, and the provided catalog is
             // not a pattern
-            String catalog = dbPaths.get(0).catalog;
+            String catalog = catalogs[0].name;
             if (isNotEmpty(catalog) && catalog.indexOf('%') < 0) {
                 dataMap.setDefaultCatalog(catalog);
             }
@@ -269,7 +269,7 @@ public class DbImportConfiguration {
             // do not override default schema of existing DataMap unless it is
             // explicitly requested by the plugin caller, and the provided schema is
             // not a pattern
-            String schema = dbPaths.get(0).schema;
+            String schema = catalogs[0].schemas[0].name;
             if (isNotEmpty(schema) && schema.indexOf('%') < 0) {
                 dataMap.setDefaultSchema(schema);
             }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f438729f/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/config/Catalog.java
----------------------------------------------------------------------
diff --git a/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/config/Catalog.java b/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/config/Catalog.java
index 8a01502..e260e96 100644
--- a/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/config/Catalog.java
+++ b/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/config/Catalog.java
@@ -95,4 +95,16 @@ public class Catalog extends FilterContainer {
         }
         return true;
     }
+
+    public StringBuilder toString(StringBuilder res, String prefix) {
+        res.append(prefix).append("Catalog: ").append(name).append("\n");
+
+        if (!isBlank(schemas)) {
+            for (Schema schema : schemas) {
+                schema.toString(res, prefix + "  ");
+            }
+        }
+
+        return super.toString(res, prefix + "  ");
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f438729f/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/config/FilterContainer.java
----------------------------------------------------------------------
diff --git a/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/config/FilterContainer.java b/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/config/FilterContainer.java
index ff9ddd7..a69540b 100644
--- a/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/config/FilterContainer.java
+++ b/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/config/FilterContainer.java
@@ -113,4 +113,32 @@ public class FilterContainer {
             && includeTables.isEmpty()     && excludeTables.isEmpty()
             && includeProcedures.isEmpty() && excludeProcedures.isEmpty();
     }
+
+    public static boolean isBlank(Collection<?> collection) {
+        return collection == null || collection.isEmpty();
+    }
+
+    @Override
+    public String toString() {
+        return toString(new StringBuilder(), "").toString();
+    }
+
+    public StringBuilder toString(StringBuilder res, String prefix) {
+        appendCollection(res, prefix, includeTables);
+        appendCollection(res, prefix, excludeTables);
+        appendCollection(res, prefix, includeColumns);
+        appendCollection(res, prefix, excludeColumns);
+        appendCollection(res, prefix, includeProcedures);
+        appendCollection(res, prefix, excludeProcedures);
+
+        return res;
+    }
+
+    protected void appendCollection(StringBuilder res, String prefix, Collection<? extends PatternParam> collection) {
+        if (!isBlank(collection)) {
+            for (PatternParam item : collection) {
+                item.toString(res, prefix);
+            }
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f438729f/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/config/FiltersConfigBuilder.java
----------------------------------------------------------------------
diff --git a/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/config/FiltersConfigBuilder.java b/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/config/FiltersConfigBuilder.java
index 7b5819d..272db1b 100644
--- a/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/config/FiltersConfigBuilder.java
+++ b/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/config/FiltersConfigBuilder.java
@@ -18,20 +18,21 @@
  ****************************************************************/
 package org.apache.cayenne.tools.dbimport.config;
 
-import static org.apache.cayenne.access.loader.filters.FilterFactory.NULL;
-import static org.apache.cayenne.access.loader.filters.FilterFactory.TRUE;
+import org.apache.cayenne.access.loader.filters.OldFilterConfigBridge;
+import org.apache.cayenne.access.loader.filters.CatalogFilter;
+import org.apache.cayenne.access.loader.filters.IncludeTableFilter;
+import org.apache.cayenne.access.loader.filters.SchemaFilter;
+import org.apache.cayenne.access.loader.filters.TableFilter;
+import org.apache.cayenne.access.loader.filters.FiltersConfig;
+import org.apache.cayenne.access.loader.filters.PatternFilter;
+import org.apache.cayenne.tools.ExcludeTable;
 
-import java.lang.reflect.Method;
 import java.util.Collection;
-import java.util.LinkedList;
-import java.util.List;
+import java.util.SortedSet;
+import java.util.TreeSet;
+import java.util.regex.Pattern;
 
-import org.apache.cayenne.access.loader.filters.DbPath;
-import org.apache.cayenne.access.loader.filters.EntityFilters;
-import org.apache.cayenne.access.loader.filters.Filter;
-import org.apache.cayenne.access.loader.filters.FilterFactory;
-import org.apache.cayenne.access.loader.filters.FiltersConfig;
-import org.apache.cayenne.access.loader.filters.ListFilter;
+import static org.apache.commons.lang.StringUtils.isBlank;
 
 /**
 * @since 3.2.
@@ -39,133 +40,328 @@ import org.apache.cayenne.access.loader.filters.ListFilter;
 public final class FiltersConfigBuilder {
 
     private final ReverseEngineering engineering;
-    private final List<EntityFilters> filters = new LinkedList<EntityFilters>();
 
     public FiltersConfigBuilder(ReverseEngineering engineering) {
         this.engineering = engineering;
     }
 
-    public FiltersConfigBuilder add(EntityFilters filter) {
-        if (!filter.isEmpty()) {
-            this.filters.add(filter);
-        } else if (!filter.getDbPath().equals(new DbPath())) {
-            this.filters.add(defaultFilter(filter.getDbPath()));
+    public FiltersConfig filtersConfig() {
+        compact();
+
+        return new FiltersConfig(transformCatalogs(engineering.getCatalogs()));
+    }
+
+    private CatalogFilter[] transformCatalogs(Collection<Catalog> catalogs) {
+        CatalogFilter[] catalogFilters = new CatalogFilter[catalogs.size()];
+        int i = 0;
+        for (Catalog catalog : catalogs) {
+            catalogFilters[i] = new CatalogFilter(catalog.getName(), transformSchemas(catalog.getSchemas()));
+            i++;
         }
+        
+        return catalogFilters;
+    }
 
-        return this;
+    private SchemaFilter[] transformSchemas(Collection<Schema> schemas) {
+        SchemaFilter[] schemaFilters = new SchemaFilter[schemas.size()];
+        int i = 0;
+        for (Schema schema : schemas) {
+            schemaFilters[i] = new SchemaFilter(schema.getName(),
+                    new TableFilter(transformIncludeTable(schema.getIncludeTables()),
+                                    transformExcludeTable(schema.getExcludeTables())),
+                    transform(schema.getIncludeProcedures(), schema.getExcludeProcedures()));
+            i++;
+        }
+
+        return schemaFilters;
     }
 
-    public FiltersConfig filtersConfig() {
-        DbPath path = new DbPath();
+    private SortedSet<Pattern> transformExcludeTable(Collection<ExcludeTable> excludeTables) {
+        SortedSet<Pattern> res = new TreeSet<Pattern>(PatternFilter.PATTERN_COMPARATOR);
+        for (ExcludeTable exclude : excludeTables) {
+            res.add(PatternFilter.pattern(exclude.getPattern()));
+        }
+        return res;
+    }
+
+    private SortedSet<IncludeTableFilter> transformIncludeTable(Collection<IncludeTable> includeTables) {
+        SortedSet<IncludeTableFilter> includeTableFilters = new TreeSet<IncludeTableFilter>();
+        for (IncludeTable includeTable : includeTables) {
+            includeTableFilters.add(new IncludeTableFilter(includeTable.getPattern(),
+                    transform(includeTable.getIncludeColumns(), includeTable.getExcludeColumns())));
+        }
+
+        return includeTableFilters;
+    }
 
-        filters.addAll(processFilters(path, engineering));
-        filters.addAll(processSchemas(path, engineering.getSchemas()));
-        filters.addAll(processCatalog(path, engineering.getCatalogs()));
+    private PatternFilter transform(Collection<? extends PatternParam> include,
+                                    Collection<? extends PatternParam> exclude) {
+        PatternFilter filter = new PatternFilter();
 
-        if (filters.isEmpty()) {
-            filters.add(defaultFilter(path));
+        for (PatternParam patternParam : include) {
+            filter.include(patternParam.getPattern());
         }
-        return new FiltersConfig(filters);
+
+        for (PatternParam patternParam : exclude) {
+            filter.exclude(patternParam.getPattern());
+        }
+
+        return filter;
+
+    }
+
+    /**
+     * Goal of this method transform ReverseEngineering config into more regular form
+     * From
+     *      ReverseEngineering
+     *          Catalog
+     *              Schema
+     *                  IncludeTable
+     *                      IncludeColumn
+     *                      ExcludeColumn
+     *                  ExcludeTable
+     *                  IncludeProcedures
+     *                  ExcludeProcedures
+     *                  IncludeColumn
+     *                  ExcludeColumn
+     *              IncludeTable
+     *                  IncludeColumn
+     *                  ExcludeColumn
+     *              ExcludeTable
+     *              IncludeProcedures
+     *              ExcludeProcedures
+     *              IncludeColumn
+     *              ExcludeColumn
+     *          Schema
+     *              IncludeTable
+     *                  IncludeColumn
+     *                  ExcludeColumn
+     *              ExcludeTable
+     *              IncludeProcedures
+     *              ExcludeProcedures
+     *              IncludeColumn
+     *              ExcludeColumn
+     *          IncludeTable
+     *              IncludeColumn
+     *              ExcludeColumn
+     *          ExcludeTable
+     *          IncludeProcedures
+     *          ExcludeProcedures
+     *          IncludeColumn
+     *          ExcludeColumn
+     *
+     * Into
+     *      ReverseEngineering
+     *          Catalog
+     *              Schema
+     *                  IncludeTable
+     *                      IncludeColumn
+     *                      ExcludeColumn
+     *                  ExcludeTable
+     *                  IncludeProcedures
+     *                  ExcludeProcedures
+     *
+     *
+     * */
+    public void compact() {
+        addEmptyElements();
+
+        compactColumnFilters();
+        compactTableFilter();
+        compactProcedureFilter();
+        compactSchemas();
     }
 
-    private EntityFilters defaultFilter(DbPath path) {
-        return new EntityFilters(path, TRUE, TRUE, NULL);
+    private void compactSchemas() {
+        for (Catalog catalog : engineering.getCatalogs()) {
+            catalog.getSchemas().addAll(engineering.getSchemas());
+            engineering.setSchemas(null);
+        }
     }
 
-    private Collection<? extends EntityFilters> processSchemas(DbPath root, Collection<Schema> schemas) {
-        List<EntityFilters> filters = new LinkedList<EntityFilters>();
-        for (Schema schema : schemas) {
-            DbPath path = new DbPath(root.catalog, schema.getName());
-            List<EntityFilters> schemaFilters = processFilters(path, schema);
-            if (schemaFilters.isEmpty()) {
-                schemaFilters.add(defaultFilter(path));
+    private void compactProcedureFilter() {
+        Collection<IncludeProcedure> engIncludeProcedures = engineering.getIncludeProcedures();
+        Collection<ExcludeProcedure> engExcludeProcedures = engineering.getExcludeProcedures();
+
+        engineering.setIncludeProcedures(null);
+        engineering.setExcludeProcedures(null);
+
+        for (Catalog catalog : engineering.getCatalogs()) {
+            Collection<IncludeProcedure> catalogIncludeProcedures = catalog.getIncludeProcedures();
+            Collection<ExcludeProcedure> catalogExcludeProcedures = catalog.getExcludeProcedures();
+
+            catalog.setIncludeProcedures(null);
+            catalog.setExcludeProcedures(null);
+
+            for (Schema schema : catalog.getSchemas()) {
+                schema.getIncludeProcedures().addAll(engIncludeProcedures);
+                schema.getIncludeProcedures().addAll(catalogIncludeProcedures);
+
+                schema.getExcludeProcedures().addAll(engExcludeProcedures);
+                schema.getExcludeProcedures().addAll(catalogExcludeProcedures);
             }
+        }
 
-            filters.addAll(schemaFilters);
+        for (Schema schema : engineering.getSchemas()) {
+            schema.getIncludeProcedures().addAll(engIncludeProcedures);
+            schema.getExcludeProcedures().addAll(engExcludeProcedures);
         }
+    }
+
+    private void compactTableFilter() {
+        Collection<IncludeTable> engIncludeTables = engineering.getIncludeTables();
+        Collection<ExcludeTable> engExcludeTables = engineering.getExcludeTables();
+
+        engineering.setIncludeTables(null);
+        engineering.setExcludeTables(null);
+
+        for (Catalog catalog : engineering.getCatalogs()) {
+            Collection<IncludeTable> catalogIncludeTables = catalog.getIncludeTables();
+            Collection<ExcludeTable> catalogExcludeTables = catalog.getExcludeTables();
 
-        return filters;
+            catalog.setIncludeTables(null);
+            catalog.setExcludeTables(null);
+
+            for (Schema schema : catalog.getSchemas()) {
+                schema.getIncludeTables().addAll(engIncludeTables);
+                schema.getIncludeTables().addAll(catalogIncludeTables);
+                
+                schema.getExcludeTables().addAll(engExcludeTables);
+                schema.getExcludeTables().addAll(catalogExcludeTables);
+            }
+        }
+
+        for (Schema schema : engineering.getSchemas()) {
+            schema.getIncludeTables().addAll(engIncludeTables);
+            schema.getExcludeTables().addAll(engExcludeTables);
+        }
     }
 
-    private Collection<? extends EntityFilters> processCatalog(DbPath root, Collection<Catalog> catalogs) {
-        List<EntityFilters> filters = new LinkedList<EntityFilters>();
-        for (Catalog catalog: catalogs) {
-            DbPath path = new DbPath(catalog.getName());
+    private void compactColumnFilters() {
+        Collection<IncludeColumn> engIncludeColumns = engineering.getIncludeColumns();
+        Collection<ExcludeColumn> engExcludeColumns = engineering.getExcludeColumns();
+
+        engineering.setIncludeColumns(null);
+        engineering.setExcludeColumns(null);
+
+        for (Catalog catalog : engineering.getCatalogs()) {
+            Collection<IncludeColumn> catalogIncludeColumns = catalog.getIncludeColumns();
+            Collection<ExcludeColumn> catalogExcludeColumns = catalog.getExcludeColumns();
+
+            catalog.setIncludeColumns(null);
+            catalog.setExcludeColumns(null);
+
+            for (Schema schema : catalog.getSchemas()) {
+                Collection<IncludeColumn> schemaIncludeColumns = schema.getIncludeColumns();
+                Collection<ExcludeColumn> schemaExcludeColumns = schema.getExcludeColumns();
+
+                schema.setIncludeColumns(null);
+                schema.setExcludeColumns(null);
 
-            List<EntityFilters> catalogFilters = new LinkedList<EntityFilters>();
-            catalogFilters.addAll(processFilters(path, catalog));
-            catalogFilters.addAll(processSchemas(path, catalog.getSchemas()));
+                for (IncludeTable includeTable : schema.getIncludeTables()) {
+                    includeTable.getIncludeColumns().addAll(engIncludeColumns);
+                    includeTable.getIncludeColumns().addAll(catalogIncludeColumns);
+                    includeTable.getIncludeColumns().addAll(schemaIncludeColumns);
 
-            if (catalogFilters.isEmpty()) {
-                catalogFilters.add(defaultFilter(path));
+                    includeTable.getExcludeColumns().addAll(engExcludeColumns);
+                    includeTable.getExcludeColumns().addAll(catalogExcludeColumns);
+                    includeTable.getExcludeColumns().addAll(schemaExcludeColumns);
+                }
             }
 
-            filters.addAll(catalogFilters);
+            for (IncludeTable includeTable : catalog.getIncludeTables()) {
+                includeTable.getIncludeColumns().addAll(engIncludeColumns);
+                includeTable.getIncludeColumns().addAll(catalogIncludeColumns);
+
+                includeTable.getExcludeColumns().addAll(engExcludeColumns);
+                includeTable.getExcludeColumns().addAll(catalogExcludeColumns);
+            }
         }
 
-        return filters;
-    }
+        for (Schema schema : engineering.getSchemas()) {
+            Collection<IncludeColumn> schemaIncludeColumns = schema.getIncludeColumns();
+            Collection<ExcludeColumn> schemaExcludeColumns = schema.getExcludeColumns();
 
-    private List<EntityFilters> processFilters(DbPath root, FilterContainer container) {
-        LinkedList<EntityFilters> res = new LinkedList<EntityFilters>();
-        res.addAll(processTableFilters(root, container.getIncludeTables()));
+            schema.setIncludeColumns(null);
+            schema.setExcludeColumns(null);
 
-        EntityFilters filter = new EntityFilters(
-                root,
-                processIncludes(container.getIncludeTables()).join(processExcludes(container.getExcludeTables())),
-                processIncludes(container.getIncludeColumns()).join(processExcludes(container.getExcludeColumns())),
-                processIncludes(container.getIncludeProcedures()).join(processExcludes(container.getExcludeProcedures()))
-        );
+            for (IncludeTable includeTable : schema.getIncludeTables()) {
+                includeTable.getIncludeColumns().addAll(engIncludeColumns);
+                includeTable.getIncludeColumns().addAll(schemaIncludeColumns);
 
-        if (!filter.isEmpty()) {
-            res.add(filter);
+                includeTable.getExcludeColumns().addAll(engExcludeColumns);
+                includeTable.getExcludeColumns().addAll(schemaExcludeColumns);
+            }
         }
 
-        return res;
+        for (IncludeTable includeTable : engineering.getIncludeTables()) {
+            includeTable.getIncludeColumns().addAll(engIncludeColumns);
+            includeTable.getExcludeColumns().addAll(engExcludeColumns);
+        }
     }
 
-    private List<EntityFilters> processTableFilters(DbPath root, Collection<IncludeTable> tables) {
-        List<EntityFilters> list = new LinkedList<EntityFilters>();
-        for (IncludeTable includeTable : tables) {
-            Filter<String> filter = TRUE
-                    .join(processIncludes(includeTable.getIncludeColumns()))
-                    .join(processExcludes(includeTable.getExcludeColumns()));
+    private void addEmptyElements() {
+        if (engineering.getCatalogs().isEmpty()) {
+            engineering.addCatalog(new Catalog());
+        }
+
+        for (Catalog catalog : engineering.getCatalogs()) {
+            if (catalog.getSchemas().isEmpty()
+                    && engineering.getSchemas().isEmpty()) {
+                catalog.addSchema(new Schema());
+            }
 
-            DbPath dbPath = new DbPath(root.catalog, root.schema, includeTable.getPattern());
-            list.add(new EntityFilters(dbPath, NULL, filter, NULL));
+            for (Schema schema : catalog.getSchemas()) {
+                if (schema.getIncludeTables().isEmpty()
+                        && catalog.getIncludeTables().isEmpty()
+                        && engineering.getIncludeTables().isEmpty()) {
+
+                    schema.addIncludeTable(new IncludeTable());
+                }
+            }
         }
-        return list;
-    }
 
-    private Filter<String> processIncludes(Collection<? extends PatternParam> filters) {
-        return processFilters("include", filters);
-    }
+        for (Schema schema : engineering.getSchemas()) {
+            if (schema.getIncludeTables().isEmpty()
+                    && engineering.getIncludeTables().isEmpty()) {
 
-    private Filter<String> processExcludes(Collection<? extends PatternParam> excludeProcedures) {
-        return processFilters("exclude", excludeProcedures);
+                schema.addIncludeTable(new IncludeTable());
+            }
+        }
     }
 
-    private Filter<String> processFilters(String factoryMethodName, Collection<? extends PatternParam> includeProcedures) {
-        Method factoryMethod;
-        try {
-            factoryMethod = FilterFactory.class.getMethod(factoryMethodName, String.class);
-        } catch (NoSuchMethodException e) {
-            throw new IllegalStateException(e);
-        }
-
-        Collection<Filter<String>> filters = new LinkedList<Filter<String>>();
-        for (PatternParam includeProcedure : includeProcedures) {
-            try {
-                filters.add((Filter<String>) factoryMethod.invoke(FilterFactory.class, includeProcedure.getPattern()));
-            } catch (Exception e) {
-                // TODO log / process exact parsing exception
-                e.printStackTrace();
-            }
+    public FiltersConfigBuilder add(OldFilterConfigBridge build) {
+        if (!isBlank(build.catalog())) {
+            engineering.addCatalog(new Catalog(build.catalog()));
+        }
+
+        if (!isBlank(build.schema())) {
+            engineering.addSchema(new Schema(build.schema()));
         }
 
-        if (filters.isEmpty()) {
-            return NULL;
+        if (!isBlank(build.getIncludeTableFilters())) {
+            engineering.addIncludeTable(new IncludeTable(build.getIncludeTableFilters()));
         }
-        return new ListFilter<String>(filters);
+        if (!isBlank(build.getExcludeTableFilters())) {
+            engineering.addExcludeTable(new ExcludeTable(build.getExcludeTableFilters()));
+        }
+        
+        if (!isBlank(build.getIncludeColumnFilters())) {
+            engineering.addIncludeColumn(new IncludeColumn(build.getIncludeColumnFilters()));
+        }
+        if (!isBlank(build.getExcludeColumnFilters())) {
+            engineering.addExcludeColumn(new ExcludeColumn(build.getExcludeColumnFilters()));
+        }
+
+        if (build.isLoadProcedures()) {
+            if (!isBlank(build.getIncludeProceduresFilters())) {
+                engineering.addIncludeProcedure(new IncludeProcedure(build.getIncludeProceduresFilters()));
+            }
+            if (!isBlank(build.getExcludeProceduresFilters())) {
+                engineering.addExcludeProcedure(new ExcludeProcedure(build.getExcludeProceduresFilters()));
+            }
+        }
+
+        return this;
     }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f438729f/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/config/IncludeTable.java
----------------------------------------------------------------------
diff --git a/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/config/IncludeTable.java b/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/config/IncludeTable.java
index e627eea..493eb88 100644
--- a/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/config/IncludeTable.java
+++ b/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/config/IncludeTable.java
@@ -21,6 +21,7 @@ package org.apache.cayenne.tools.dbimport.config;
 import java.util.Collection;
 import java.util.LinkedList;
 
+import static org.apache.commons.lang.StringUtils.isBlank;
 import static org.apache.commons.lang.StringUtils.join;
 
 /**
@@ -63,15 +64,22 @@ public class IncludeTable extends PatternParam {
     }
 
     @Override
-    public String toString() {
-        String str = "+(" + getPattern() + ") ";
+    public StringBuilder toString(StringBuilder res, String s) {
+        super.toString(res, s);
+
+        String prefix = s + "  ";
         if (includeColumns != null && !includeColumns.isEmpty()) {
-            str += "+Columns(" + join(includeColumns, ", ") + ") ";
+            for (IncludeColumn includeColumn : includeColumns) {
+                includeColumn.toString(res, prefix);
+            }
         }
 
         if (excludeColumns != null && !excludeColumns.isEmpty()) {
-            str += "-Columns(" + join(excludeColumns, ", ") + ") ";
+            for (ExcludeColumn excludeColumn : excludeColumns) {
+                excludeColumn.toString(res, prefix);
+            }
         }
-        return str;
+
+        return res;
     }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f438729f/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/config/PatternParam.java
----------------------------------------------------------------------
diff --git a/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/config/PatternParam.java b/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/config/PatternParam.java
index 3d8297c..eaab613 100644
--- a/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/config/PatternParam.java
+++ b/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/config/PatternParam.java
@@ -69,6 +69,11 @@ public class PatternParam {
 
     @Override
     public String toString() {
-        return "RegExp(" + pattern + ")";
+        return toString(new StringBuilder(), "").toString();
+    }
+
+    public StringBuilder toString(StringBuilder res, String s) {
+        res.append(s).append(getClass().getSimpleName()).append(": ").append(pattern).append("\n");
+        return res;
     }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f438729f/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/config/ReverseEngineering.java
----------------------------------------------------------------------
diff --git a/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/config/ReverseEngineering.java b/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/config/ReverseEngineering.java
index 8f4277b..2aabf71 100644
--- a/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/config/ReverseEngineering.java
+++ b/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/config/ReverseEngineering.java
@@ -57,4 +57,23 @@ public class ReverseEngineering extends FilterContainer {
         this.catalogs.add(catalog);
     }
 
+    @Override
+    public String toString() {
+        StringBuilder res = new StringBuilder();
+        res.append("ReverseEngineering: ").append("\n");
+
+        if (!isBlank(catalogs)) {
+            for (Catalog catalog : catalogs) {
+                catalog.toString(res, "  ");
+            }
+        }
+
+        if (!isBlank(schemas)) {
+            for (Schema schema : schemas) {
+                schema.toString(res, "  ");
+            }
+        }
+
+        return super.toString(res, "  ").toString();
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f438729f/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/config/Schema.java
----------------------------------------------------------------------
diff --git a/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/config/Schema.java b/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/config/Schema.java
index 1a399f0..a528eee 100644
--- a/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/config/Schema.java
+++ b/cayenne-tools/src/main/java/org/apache/cayenne/tools/dbimport/config/Schema.java
@@ -55,4 +55,11 @@ public class Schema extends FilterContainer {
 
         setName(name);
     }
+
+    @Override
+    public StringBuilder toString(StringBuilder res, String prefix) {
+        res.append(prefix).append("Schema: ").append(name).append("\n");
+
+        return super.toString(res, prefix + "  ");
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f438729f/cayenne-tools/src/test/java/org/apache/cayenne/tools/dbimport/config/FiltersConfigBuilderTest.java
----------------------------------------------------------------------
diff --git a/cayenne-tools/src/test/java/org/apache/cayenne/tools/dbimport/config/FiltersConfigBuilderTest.java b/cayenne-tools/src/test/java/org/apache/cayenne/tools/dbimport/config/FiltersConfigBuilderTest.java
index 6861e2b..0e723e0 100644
--- a/cayenne-tools/src/test/java/org/apache/cayenne/tools/dbimport/config/FiltersConfigBuilderTest.java
+++ b/cayenne-tools/src/test/java/org/apache/cayenne/tools/dbimport/config/FiltersConfigBuilderTest.java
@@ -19,20 +19,244 @@
 
 package org.apache.cayenne.tools.dbimport.config;
 
-import org.apache.cayenne.access.loader.filters.DbPath;
-import org.apache.cayenne.access.loader.filters.EntityFilters;
-import org.apache.cayenne.access.loader.filters.FiltersConfig;
 import org.apache.cayenne.tools.ExcludeTable;
 import org.junit.Test;
 
-import static org.apache.cayenne.access.loader.filters.FilterFactory.*;
-import static org.apache.cayenne.access.loader.filters.FiltersFactory.*;
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
 
 public class FiltersConfigBuilderTest {
 
     @Test
+    public void testCompact_01() {
+        ReverseEngineering engineering = new ReverseEngineering();
+        engineering.addIncludeTable(new IncludeTable("table1"));
+        engineering.addIncludeTable(new IncludeTable("table2"));
+        engineering.addIncludeTable(new IncludeTable("table3"));
+
+        engineering.addIncludeColumn(new IncludeColumn("includeColumn"));
+
+        FiltersConfigBuilder builder = new FiltersConfigBuilder(engineering);
+        builder.compact();
+        assertEquals(
+                "ReverseEngineering: \n" +
+                "  Catalog: null\n" +
+                "    Schema: null\n" +
+                "      IncludeTable: table1\n" +
+                "        IncludeColumn: includeColumn\n" +
+                "      IncludeTable: table2\n" +
+                "        IncludeColumn: includeColumn\n" +
+                "      IncludeTable: table3\n" +
+                "        IncludeColumn: includeColumn\n", engineering.toString());
+    }
+
+    @Test
+    public void testCompact_02() {
+        ReverseEngineering engineering = new ReverseEngineering();
+        engineering.addCatalog(new Catalog("catalogName"));
+        engineering.addSchema(new Schema("schemaName01"));
+        engineering.addSchema(new Schema("schemaName02"));
+
+        engineering.addIncludeTable(new IncludeTable("table1"));
+        engineering.addExcludeTable(new ExcludeTable("table2"));
+
+        engineering.addIncludeColumn(new IncludeColumn("includeColumn"));
+
+        FiltersConfigBuilder builder = new FiltersConfigBuilder(engineering);
+        builder.compact();
+        assertEquals(
+                "ReverseEngineering: \n" +
+                "  Catalog: catalogName\n" +
+                "    Schema: schemaName01\n" +
+                "      IncludeTable: table1\n" +
+                "        IncludeColumn: includeColumn\n" +
+                "      ExcludeTable: table2\n" +
+                "    Schema: schemaName02\n" +
+                "      IncludeTable: table1\n" +
+                "        IncludeColumn: includeColumn\n" +
+                "      ExcludeTable: table2\n", engineering.toString());
+    }
+
+
+    @Test
+    public void testCompact_03() {
+        ReverseEngineering engineering = new ReverseEngineering();
+        engineering.addCatalog(new Catalog("APP"));
+
+        engineering.addExcludeTable(new ExcludeTable("SYS_.*"));
+        engineering.addExcludeColumn(new ExcludeColumn("calculated_.*"));
+
+        FiltersConfigBuilder builder = new FiltersConfigBuilder(engineering);
+        builder.compact();
+        assertEquals(
+                "ReverseEngineering: \n" +
+                "  Catalog: APP\n" +
+                "    Schema: null\n" +
+                "      IncludeTable: null\n" +
+                "        ExcludeColumn: calculated_.*\n" +
+                "      ExcludeTable: SYS_.*\n", engineering.toString());
+    }
+
+    @Test
+    public void testCompact_04() {
+        ReverseEngineering engineering = new ReverseEngineering();
+        engineering.addSchema(new Schema("s"));
+
+        FiltersConfigBuilder builder = new FiltersConfigBuilder(engineering);
+        builder.compact();
+        assertEquals(
+                "ReverseEngineering: \n" +
+                "  Catalog: null\n" +
+                "    Schema: s\n" +
+                "      IncludeTable: null\n", engineering.toString());
+    }
+
+    @Test
+    public void testCompact_full() {
+        ReverseEngineering engineering = new ReverseEngineering();
+        Catalog cat01 = new Catalog("cat_01");
+
+        Schema sch01 = new Schema("sch_01");
+
+        sch01.addIncludeTable(includeTable("t1", "c11", "c12"));
+        sch01.addExcludeTable(new ExcludeTable("t2"));
+        sch01.addIncludeProcedure(new IncludeProcedure("p1"));
+        sch01.addExcludeProcedure(new ExcludeProcedure("p2"));
+        sch01.addIncludeColumn(new IncludeColumn("c_x1"));
+        sch01.addExcludeColumn(new ExcludeColumn("c_x2"));
+
+        cat01.addSchema(sch01);
+
+        cat01.addIncludeTable(includeTable("t3", "c31", "c32"));
+        cat01.addExcludeTable(new ExcludeTable("t4"));
+        cat01.addIncludeProcedure(new IncludeProcedure("p3"));
+        cat01.addExcludeProcedure(new ExcludeProcedure("p4"));
+        cat01.addIncludeColumn(new IncludeColumn("c_xx1"));
+        cat01.addExcludeColumn(new ExcludeColumn("c_xx2"));
+
+        engineering.addCatalog(cat01);
+
+        Schema sch02 = new Schema("sch_02");
+
+        sch02.addIncludeTable(includeTable("t5", "c51", "c52"));
+        sch02.addExcludeTable(new ExcludeTable("t6"));
+        sch02.addIncludeProcedure(new IncludeProcedure("p5"));
+        sch02.addExcludeProcedure(new ExcludeProcedure("p6"));
+        sch02.addIncludeColumn(new IncludeColumn("c2_x1"));
+        sch02.addExcludeColumn(new ExcludeColumn("c2_x2"));
+
+        engineering.addSchema(sch02);
+
+        engineering.addIncludeTable(includeTable("t7", "c71", "c72"));
+        engineering.addExcludeTable(new ExcludeTable("t8"));
+        engineering.addIncludeProcedure(new IncludeProcedure("p7"));
+        engineering.addExcludeProcedure(new ExcludeProcedure("p8"));
+        engineering.addIncludeColumn(new IncludeColumn("c_xxx1"));
+        engineering.addExcludeColumn(new ExcludeColumn("c_xxx2"));
+
+        FiltersConfigBuilder builder = new FiltersConfigBuilder(engineering);
+        assertEquals("Original ReverseEngineering should be",
+                "ReverseEngineering: \n" +
+                "  Catalog: cat_01\n" +
+                "    Schema: sch_01\n" +
+                "      IncludeTable: t1\n" +
+                "        IncludeColumn: c11\n" +
+                "        ExcludeColumn: c12\n" +
+                "      ExcludeTable: t2\n" +
+                "      IncludeColumn: c_x1\n" +
+                "      ExcludeColumn: c_x2\n" +
+                "      IncludeProcedure: p1\n" +
+                "      ExcludeProcedure: p2\n" +
+                "    IncludeTable: t3\n" +
+                "      IncludeColumn: c31\n" +
+                "      ExcludeColumn: c32\n" +
+                "    ExcludeTable: t4\n" +
+                "    IncludeColumn: c_xx1\n" +
+                "    ExcludeColumn: c_xx2\n" +
+                "    IncludeProcedure: p3\n" +
+                "    ExcludeProcedure: p4\n" +
+                "  Schema: sch_02\n" +
+                "    IncludeTable: t5\n" +
+                "      IncludeColumn: c51\n" +
+                "      ExcludeColumn: c52\n" +
+                "    ExcludeTable: t6\n" +
+                "    IncludeColumn: c2_x1\n" +
+                "    ExcludeColumn: c2_x2\n" +
+                "    IncludeProcedure: p5\n" +
+                "    ExcludeProcedure: p6\n" +
+                "  IncludeTable: t7\n" +
+                "    IncludeColumn: c71\n" +
+                "    ExcludeColumn: c72\n" +
+                "  ExcludeTable: t8\n" +
+                "  IncludeColumn: c_xxx1\n" +
+                "  ExcludeColumn: c_xxx2\n" +
+                "  IncludeProcedure: p7\n" +
+                "  ExcludeProcedure: p8\n", engineering.toString());
+
+
+        builder.compact();
+        assertEquals(
+                "ReverseEngineering: \n" +
+                        "  Catalog: cat_01\n" +
+                        "    Schema: sch_01\n" +
+                        "      IncludeTable: t1\n" +
+                        "        IncludeColumn: c11\n" +
+                        "        IncludeColumn: c_xxx1\n" +
+                        "        IncludeColumn: c_xx1\n" +
+                        "        IncludeColumn: c_x1\n" +
+                        "        ExcludeColumn: c12\n" +
+                        "        ExcludeColumn: c_xxx2\n" +
+                        "        ExcludeColumn: c_xx2\n" +
+                        "        ExcludeColumn: c_x2\n" +
+                        "      IncludeTable: t7\n" +
+                        "        IncludeColumn: c71\n" +
+                        "        IncludeColumn: c_xxx1\n" +
+                        "        ExcludeColumn: c72\n" +
+                        "        ExcludeColumn: c_xxx2\n" +
+                        "      IncludeTable: t3\n" +
+                        "        IncludeColumn: c31\n" +
+                        "        IncludeColumn: c_xxx1\n" +
+                        "        IncludeColumn: c_xx1\n" +
+                        "        ExcludeColumn: c32\n" +
+                        "        ExcludeColumn: c_xxx2\n" +
+                        "        ExcludeColumn: c_xx2\n" +
+                        "      ExcludeTable: t2\n" +
+                        "      ExcludeTable: t8\n" +
+                        "      ExcludeTable: t4\n" +
+                        "      IncludeProcedure: p1\n" +
+                        "      IncludeProcedure: p7\n" +
+                        "      IncludeProcedure: p3\n" +
+                        "      ExcludeProcedure: p2\n" +
+                        "      ExcludeProcedure: p8\n" +
+                        "      ExcludeProcedure: p4\n" +
+                        "    Schema: sch_02\n" +
+                        "      IncludeTable: t5\n" +
+                        "        IncludeColumn: c51\n" +
+                        "        IncludeColumn: c_xxx1\n" +
+                        "        IncludeColumn: c2_x1\n" +
+                        "        ExcludeColumn: c52\n" +
+                        "        ExcludeColumn: c_xxx2\n" +
+                        "        ExcludeColumn: c2_x2\n" +
+                        "      IncludeTable: t7\n" +
+                        "        IncludeColumn: c71\n" +
+                        "        IncludeColumn: c_xxx1\n" +
+                        "        ExcludeColumn: c72\n" +
+                        "        ExcludeColumn: c_xxx2\n" +
+                        "      ExcludeTable: t6\n" +
+                        "      ExcludeTable: t8\n" +
+                        "      IncludeProcedure: p5\n" +
+                        "      IncludeProcedure: p7\n" +
+                        "      ExcludeProcedure: p6\n" +
+                        "      ExcludeProcedure: p8\n", engineering.toString());
+    }
+
+    protected IncludeTable includeTable(String name, String incCol, String excCol) {
+        IncludeTable incTable01 = new IncludeTable(name);
+        incTable01.addIncludeColumn(new IncludeColumn(incCol));
+        incTable01.addExcludeColumn(new ExcludeColumn(excCol));
+        return incTable01;
+    }
+
+    /*@Test
     public void testEmptyDbEntitiesFilters() throws Exception {
         ReverseEngineering engineering = new ReverseEngineering();
         FiltersConfig executions = new FiltersConfigBuilder(engineering).filtersConfig();
@@ -150,5 +374,5 @@ public class FiltersConfigBuilderTest {
 
         EntityFilters filter = builder.filtersConfig().filter(path);
         assertFalse(filter.isEmpty());
-    }
+    }*/
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f438729f/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DbLoaderHelper.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DbLoaderHelper.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DbLoaderHelper.java
index 64fc8c6..feb4a49 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DbLoaderHelper.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DbLoaderHelper.java
@@ -19,25 +19,12 @@
 
 package org.apache.cayenne.modeler.dialog.db;
 
-import java.sql.Connection;
-import java.sql.SQLException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.List;
-
-import javax.swing.JFrame;
-import javax.swing.JOptionPane;
-import javax.swing.SwingUtilities;
-
 import org.apache.cayenne.CayenneException;
 import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.access.DbLoader;
 import org.apache.cayenne.access.DbLoaderDelegate;
 import org.apache.cayenne.access.loader.DbLoaderConfiguration;
-import org.apache.cayenne.access.loader.filters.EntityFilters;
-import org.apache.cayenne.access.loader.filters.FilterFactory;
-import org.apache.cayenne.access.loader.filters.FiltersConfig;
+import org.apache.cayenne.access.loader.filters.OldFilterConfigBridge;
 import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.configuration.event.DataMapEvent;
 import org.apache.cayenne.dba.DbAdapter;
@@ -60,7 +47,13 @@ import org.apache.cayenne.util.Util;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
-import static org.apache.cayenne.access.loader.filters.FilterFactory.NULL;
+import javax.swing.*;
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
 
 /**
  * Stateful helper class that encapsulates access to DbLoader.
@@ -89,7 +82,7 @@ public class DbLoaderHelper {
     protected boolean meaningfulPk;
     protected List<String> schemas;
 
-    private final EntityFilters.Builder filterBuilder = new EntityFilters.Builder();
+    private final OldFilterConfigBridge filterBuilder = new OldFilterConfigBridge();
 
     protected String loadStatusNote;
 
@@ -176,7 +169,7 @@ public class DbLoaderHelper {
 
         this.filterBuilder.schema(dialog.getSelectedSchema());
         this.filterBuilder.includeTables(dialog.getTableNamePattern());
-        this.filterBuilder.setProceduresFilters(dialog.isLoadingProcedures() ? FilterFactory.TRUE : FilterFactory.NULL);
+        this.filterBuilder.setProceduresFilters(dialog.isLoadingProcedures());
         this.filterBuilder.includeProcedures(dialog.getProcedureNamePattern());
 
         this.meaningfulPk = dialog.isMeaningfulPk();
@@ -387,14 +380,15 @@ public class DbLoaderHelper {
         }
 
         private void importingProcedures() {
-            if (!filterBuilder.proceduresFilters().equals(NULL)) {
+            if (!filterBuilder.isLoadProcedures()) {
                 return;
             }
 
             loadStatusNote = "Importing procedures...";
             try {
                 DbLoaderConfiguration configuration = new DbLoaderConfiguration();
-                configuration.setFiltersConfig(new FiltersConfig(filterBuilder.build()));
+                configuration.setFiltersConfig(new FiltersConfigBuilder(new ReverseEngineering())
+                        .add(filterBuilder).filtersConfig());
 
                 loader.loadProcedures(dataMap, new DbLoaderConfiguration());
             } catch (Throwable th) {
@@ -411,7 +405,7 @@ public class DbLoaderHelper {
                
                 DbLoaderConfiguration configuration = new DbLoaderConfiguration();
                 configuration.setFiltersConfig(new FiltersConfigBuilder(new ReverseEngineering())
-                        .add(filterBuilder.build()).filtersConfig());
+                        .add(filterBuilder).filtersConfig());
                 loader.load(dataMap, configuration);
 
                 /**

http://git-wip-us.apache.org/repos/asf/cayenne/blob/f438729f/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerOptions.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerOptions.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerOptions.java
index dc05932..decc675 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerOptions.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerOptions.java
@@ -19,44 +19,17 @@
 
 package org.apache.cayenne.modeler.dialog.db;
 
-import java.awt.Component;
-import java.io.File;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.util.Iterator;
-import java.util.List;
-
-import javax.sql.DataSource;
-import javax.swing.JFileChooser;
-import javax.swing.JOptionPane;
-import javax.swing.WindowConstants;
-import javax.swing.event.ChangeEvent;
-import javax.swing.event.ChangeListener;
-
 import org.apache.cayenne.access.loader.DbLoaderConfiguration;
-import org.apache.cayenne.access.loader.filters.DbPath;
-import org.apache.cayenne.access.loader.filters.EntityFilters;
+import org.apache.cayenne.access.loader.filters.TableFilter;
 import org.apache.cayenne.access.loader.filters.FiltersConfig;
+import org.apache.cayenne.access.loader.filters.PatternFilter;
 import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.configuration.DataNodeDescriptor;
 import org.apache.cayenne.dba.JdbcAdapter;
-import org.apache.cayenne.map.DataMap;
-import org.apache.cayenne.map.DbAttribute;
-import org.apache.cayenne.map.DbEntity;
-import org.apache.cayenne.map.DbRelationship;
-import org.apache.cayenne.map.ObjAttribute;
-import org.apache.cayenne.map.ObjEntity;
-import org.apache.cayenne.map.ObjRelationship;
+import org.apache.cayenne.map.*;
 import org.apache.cayenne.map.event.EntityEvent;
 import org.apache.cayenne.map.event.MapEvent;
-import org.apache.cayenne.merge.AbstractToDbToken;
-import org.apache.cayenne.merge.DbMerger;
-import org.apache.cayenne.merge.ExecutingMergerContext;
-import org.apache.cayenne.merge.MergeDirection;
-import org.apache.cayenne.merge.MergerContext;
-import org.apache.cayenne.merge.MergerToken;
-import org.apache.cayenne.merge.ModelMergeDelegate;
+import org.apache.cayenne.merge.*;
 import org.apache.cayenne.modeler.ProjectController;
 import org.apache.cayenne.modeler.dialog.ValidationResultBrowser;
 import org.apache.cayenne.modeler.event.AttributeDisplayEvent;
@@ -70,6 +43,18 @@ import org.apache.cayenne.swing.BindingBuilder;
 import org.apache.cayenne.swing.ObjectBinding;
 import org.apache.cayenne.validation.ValidationResult;
 
+import javax.sql.DataSource;
+import javax.swing.*;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+import java.awt.*;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.Iterator;
+import java.util.List;
+
 public class MergerOptions extends CayenneController {
 
     protected MergerOptionsView view;
@@ -170,7 +155,7 @@ public class MergerOptions extends CayenneController {
             merger = new DbMerger(adapter.mergerFactory());
 
             DbLoaderConfiguration config = new DbLoaderConfiguration();
-            config.setFiltersConfig(new FiltersConfig(new EntityFilters(new DbPath(null, defaultSchema))));
+            config.setFiltersConfig(FiltersConfig.create(null, defaultSchema, TableFilter.everything(), PatternFilter.INCLUDE_NOTHING));
 
             List<MergerToken> mergerTokens = merger.createMergeTokens(
                     connectionInfo.makeDataSource(getApplication().getClassLoadingService()),