You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@quickstep.apache.org by zu...@apache.org on 2016/04/19 18:44:29 UTC

[16/24] incubator-quickstep git commit: Added hook (not actual code) to BitWeaving. (#169)

http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/cbd169e5/parser/preprocessed/SqlParser_gen.hpp
----------------------------------------------------------------------
diff --git a/parser/preprocessed/SqlParser_gen.hpp b/parser/preprocessed/SqlParser_gen.hpp
index 807a39b..e35664f 100644
--- a/parser/preprocessed/SqlParser_gen.hpp
+++ b/parser/preprocessed/SqlParser_gen.hpp
@@ -1,8 +1,8 @@
-/* A Bison parser, made by GNU Bison 3.0.4.  */
+/* A Bison parser, made by GNU Bison 3.0.2.  */
 
 /* Bison interface for Yacc-like parsers in C
 
-   Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc.
+   Copyright (C) 1984, 1989-1990, 2000-2013 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -72,101 +72,102 @@ extern int quickstep_yydebug;
     TOKEN_ASC = 282,
     TOKEN_BIGINT = 283,
     TOKEN_BIT = 284,
-    TOKEN_BLOCKPROPERTIES = 285,
-    TOKEN_BLOCKSAMPLE = 286,
-    TOKEN_BLOOM_FILTER = 287,
-    TOKEN_CSB_TREE = 288,
-    TOKEN_BY = 289,
-    TOKEN_CASE = 290,
-    TOKEN_CHARACTER = 291,
-    TOKEN_CHECK = 292,
-    TOKEN_COLUMN = 293,
-    TOKEN_CONSTRAINT = 294,
-    TOKEN_COPY = 295,
-    TOKEN_CREATE = 296,
-    TOKEN_DATE = 297,
-    TOKEN_DATETIME = 298,
-    TOKEN_DECIMAL = 299,
-    TOKEN_DEFAULT = 300,
-    TOKEN_DELETE = 301,
-    TOKEN_DELIMITER = 302,
-    TOKEN_DESC = 303,
-    TOKEN_DISTINCT = 304,
-    TOKEN_DOUBLE = 305,
-    TOKEN_DROP = 306,
-    TOKEN_ELSE = 307,
-    TOKEN_END = 308,
-    TOKEN_ESCAPE_STRINGS = 309,
-    TOKEN_EXISTS = 310,
-    TOKEN_EXTRACT = 311,
-    TOKEN_FALSE = 312,
-    TOKEN_FIRST = 313,
-    TOKEN_FLOAT = 314,
-    TOKEN_FOREIGN = 315,
-    TOKEN_FROM = 316,
-    TOKEN_FULL = 317,
-    TOKEN_GROUP = 318,
-    TOKEN_HASH = 319,
-    TOKEN_HAVING = 320,
-    TOKEN_IN = 321,
-    TOKEN_INDEX = 322,
-    TOKEN_INNER = 323,
-    TOKEN_INSERT = 324,
-    TOKEN_INTEGER = 325,
-    TOKEN_INTERVAL = 326,
-    TOKEN_INTO = 327,
-    TOKEN_JOIN = 328,
-    TOKEN_KEY = 329,
-    TOKEN_LAST = 330,
-    TOKEN_LEFT = 331,
-    TOKEN_LIMIT = 332,
-    TOKEN_LONG = 333,
-    TOKEN_NULL = 334,
-    TOKEN_NULLS = 335,
-    TOKEN_OFF = 336,
-    TOKEN_ON = 337,
-    TOKEN_ORDER = 338,
-    TOKEN_OUTER = 339,
-    TOKEN_PARTITION = 340,
-    TOKEN_PARTITIONS = 341,
-    TOKEN_PERCENT = 342,
-    TOKEN_PRIMARY = 343,
-    TOKEN_QUIT = 344,
-    TOKEN_RANGE = 345,
-    TOKEN_REAL = 346,
-    TOKEN_REFERENCES = 347,
-    TOKEN_RIGHT = 348,
-    TOKEN_ROW_DELIMITER = 349,
-    TOKEN_SELECT = 350,
-    TOKEN_SET = 351,
-    TOKEN_SMA = 352,
-    TOKEN_SMALLINT = 353,
-    TOKEN_TABLE = 354,
-    TOKEN_THEN = 355,
-    TOKEN_TIME = 356,
-    TOKEN_TIMESTAMP = 357,
-    TOKEN_TRUE = 358,
-    TOKEN_TUPLESAMPLE = 359,
-    TOKEN_UNIQUE = 360,
-    TOKEN_UPDATE = 361,
-    TOKEN_USING = 362,
-    TOKEN_VALUES = 363,
-    TOKEN_VARCHAR = 364,
-    TOKEN_WHEN = 365,
-    TOKEN_WHERE = 366,
-    TOKEN_WITH = 367,
-    TOKEN_YEARMONTH = 368,
-    TOKEN_EOF = 369,
-    TOKEN_LEX_ERROR = 370
+    TOKEN_BITWEAVING = 285,
+    TOKEN_BLOCKPROPERTIES = 286,
+    TOKEN_BLOCKSAMPLE = 287,
+    TOKEN_BLOOM_FILTER = 288,
+    TOKEN_CSB_TREE = 289,
+    TOKEN_BY = 290,
+    TOKEN_CASE = 291,
+    TOKEN_CHARACTER = 292,
+    TOKEN_CHECK = 293,
+    TOKEN_COLUMN = 294,
+    TOKEN_CONSTRAINT = 295,
+    TOKEN_COPY = 296,
+    TOKEN_CREATE = 297,
+    TOKEN_DATE = 298,
+    TOKEN_DATETIME = 299,
+    TOKEN_DECIMAL = 300,
+    TOKEN_DEFAULT = 301,
+    TOKEN_DELETE = 302,
+    TOKEN_DELIMITER = 303,
+    TOKEN_DESC = 304,
+    TOKEN_DISTINCT = 305,
+    TOKEN_DOUBLE = 306,
+    TOKEN_DROP = 307,
+    TOKEN_ELSE = 308,
+    TOKEN_END = 309,
+    TOKEN_ESCAPE_STRINGS = 310,
+    TOKEN_EXISTS = 311,
+    TOKEN_EXTRACT = 312,
+    TOKEN_FALSE = 313,
+    TOKEN_FIRST = 314,
+    TOKEN_FLOAT = 315,
+    TOKEN_FOREIGN = 316,
+    TOKEN_FROM = 317,
+    TOKEN_FULL = 318,
+    TOKEN_GROUP = 319,
+    TOKEN_HASH = 320,
+    TOKEN_HAVING = 321,
+    TOKEN_IN = 322,
+    TOKEN_INDEX = 323,
+    TOKEN_INNER = 324,
+    TOKEN_INSERT = 325,
+    TOKEN_INTEGER = 326,
+    TOKEN_INTERVAL = 327,
+    TOKEN_INTO = 328,
+    TOKEN_JOIN = 329,
+    TOKEN_KEY = 330,
+    TOKEN_LAST = 331,
+    TOKEN_LEFT = 332,
+    TOKEN_LIMIT = 333,
+    TOKEN_LONG = 334,
+    TOKEN_NULL = 335,
+    TOKEN_NULLS = 336,
+    TOKEN_OFF = 337,
+    TOKEN_ON = 338,
+    TOKEN_ORDER = 339,
+    TOKEN_OUTER = 340,
+    TOKEN_PARTITION = 341,
+    TOKEN_PARTITIONS = 342,
+    TOKEN_PERCENT = 343,
+    TOKEN_PRIMARY = 344,
+    TOKEN_QUIT = 345,
+    TOKEN_RANGE = 346,
+    TOKEN_REAL = 347,
+    TOKEN_REFERENCES = 348,
+    TOKEN_RIGHT = 349,
+    TOKEN_ROW_DELIMITER = 350,
+    TOKEN_SELECT = 351,
+    TOKEN_SET = 352,
+    TOKEN_SMA = 353,
+    TOKEN_SMALLINT = 354,
+    TOKEN_TABLE = 355,
+    TOKEN_THEN = 356,
+    TOKEN_TIME = 357,
+    TOKEN_TIMESTAMP = 358,
+    TOKEN_TRUE = 359,
+    TOKEN_TUPLESAMPLE = 360,
+    TOKEN_UNIQUE = 361,
+    TOKEN_UPDATE = 362,
+    TOKEN_USING = 363,
+    TOKEN_VALUES = 364,
+    TOKEN_VARCHAR = 365,
+    TOKEN_WHEN = 366,
+    TOKEN_WHERE = 367,
+    TOKEN_WITH = 368,
+    TOKEN_YEARMONTH = 369,
+    TOKEN_EOF = 370,
+    TOKEN_LEX_ERROR = 371
   };
 #endif
 
 /* Value type.  */
 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
-
+typedef union YYSTYPE YYSTYPE;
 union YYSTYPE
 {
-#line 117 "../SqlParser.ypp" /* yacc.c:1915  */
+#line 117 "../SqlParser.ypp" /* yacc.c:1909  */
 
   quickstep::ParseString *string_value_;
 
@@ -256,10 +257,8 @@ union YYSTYPE
   quickstep::PtrVector<quickstep::ParseSubqueryTableReference> *with_list_;
   quickstep::ParseSubqueryTableReference *with_list_element_;
 
-#line 260 "SqlParser_gen.hpp" /* yacc.c:1915  */
+#line 261 "SqlParser_gen.hpp" /* yacc.c:1909  */
 };
-
-typedef union YYSTYPE YYSTYPE;
 # define YYSTYPE_IS_TRIVIAL 1
 # define YYSTYPE_IS_DECLARED 1
 #endif

http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/cbd169e5/parser/tests/Index.test
----------------------------------------------------------------------
diff --git a/parser/tests/Index.test b/parser/tests/Index.test
index b5184bd..605768b 100644
--- a/parser/tests/Index.test
+++ b/parser/tests/Index.test
@@ -57,3 +57,12 @@ CreateIndexStatement[index_name=bloomIndex,relation_name=test,
 CREATE INDEX csbIndex ON test USING CSBTREE
 --
 CreateIndexStatement[index_name=csbIndex,relation_name=test,index_type=cs_b_tree]
+==
+# Bitweaving is supported on builds where it was included as a submodule. The
+# parser should create code to change the catalog, but on Block creation, no
+# index will be created.
+CREATE INDEX bwIndex ON test(int_col) USING bitweaving;
+--
+CreateIndexStatement[index_name=bwIndex,relation_name=test,index_type=bitweaving]
++-attribute_list=
+  +-AttributeReference[attribute_name=int_col]

http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/cbd169e5/query_optimizer/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/query_optimizer/CMakeLists.txt b/query_optimizer/CMakeLists.txt
index 60319d4..44c8750 100644
--- a/query_optimizer/CMakeLists.txt
+++ b/query_optimizer/CMakeLists.txt
@@ -118,6 +118,7 @@ target_link_libraries(quickstep_queryoptimizer_ExecutionGenerator
                       quickstep_storage_InsertDestination_proto
                       quickstep_storage_StorageBlockLayout
                       quickstep_storage_StorageBlockLayout_proto
+                      quickstep_storage_SubBlockTypeRegistry
                       quickstep_types_Type
                       quickstep_types_Type_proto
                       quickstep_types_TypedValue

http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/cbd169e5/query_optimizer/ExecutionGenerator.cpp
----------------------------------------------------------------------
diff --git a/query_optimizer/ExecutionGenerator.cpp b/query_optimizer/ExecutionGenerator.cpp
index 43825b9..38ab09e 100644
--- a/query_optimizer/ExecutionGenerator.cpp
+++ b/query_optimizer/ExecutionGenerator.cpp
@@ -99,6 +99,7 @@
 #include "storage/InsertDestination.pb.h"
 #include "storage/StorageBlockLayout.hpp"
 #include "storage/StorageBlockLayout.pb.h"
+#include "storage/SubBlockTypeRegistry.hpp"
 #include "types/Type.hpp"
 #include "types/Type.pb.h"
 #include "types/TypedValue.hpp"
@@ -870,7 +871,7 @@ void ExecutionGenerator::convertCreateIndex(
     THROW_SQL_ERROR() << "The relation " << input_relation->getName()
         << " already defines this index on the given attribute(s).";
   }
-  if (!index_description.IsInitialized()) {
+  if (!SubBlockTypeRegistry::IndexDescriptionIsValid(*input_relation, index_description)) {
     // Check if the given index description is valid.
     THROW_SQL_ERROR() << "The index with given properties cannot be created.";
   }

http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/cbd169e5/storage/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/storage/CMakeLists.txt b/storage/CMakeLists.txt
index 37cfc3d..11c2819 100644
--- a/storage/CMakeLists.txt
+++ b/storage/CMakeLists.txt
@@ -138,6 +138,19 @@ add_library(quickstep_storage_BasicColumnStoreValueAccessor
             ../empty_src.cpp
             BasicColumnStoreValueAccessor.hpp)
 add_library(quickstep_storage_BloomFilterIndexSubBlock BloomFilterIndexSubBlock.cpp BloomFilterIndexSubBlock.hpp)
+# CMAKE_VALIDATE_IGNORE_BEGIN
+if(QUICKSTEP_HAVE_BITWEAVING)
+  add_library(quickstep_storage_BitWeavingIndexSubBlock
+              bitweaving/BitWeavingIndexSubBlock.cpp
+              bitweaving/BitWeavingIndexSubBlock.hpp)
+  add_library(quickstep_storage_BitWeavingHIndexSubBlock
+              bitweaving/BitWeavingHIndexSubBlock.cpp
+              bitweaving/BitWeavingHIndexSubBlock.hpp)
+  add_library(quickstep_storage_BitWeavingVIndexSubBlock
+              bitweaving/BitWeavingVIndexSubBlock.cpp
+              bitweaving/BitWeavingVIndexSubBlock.hpp)
+endif()
+# CMAKE_VALIDATE_IGNORE_END
 add_library(quickstep_storage_ColumnStoreUtil ColumnStoreUtil.cpp ColumnStoreUtil.hpp)
 add_library(quickstep_storage_CompressedBlockBuilder CompressedBlockBuilder.cpp CompressedBlockBuilder.hpp)
 add_library(quickstep_storage_CompressedColumnStoreTupleStorageSubBlock
@@ -316,6 +329,74 @@ target_link_libraries(quickstep_storage_BloomFilterIndexSubBlock
                       quickstep_types_operations_comparisons_ComparisonID
                       quickstep_utility_BloomFilter
                       quickstep_utility_Macros)
+# CMAKE_VALIDATE_IGNORE_BEGIN
+if(QUICKSTEP_HAVE_BITWEAVING)
+  target_link_libraries(quickstep_storage_BitWeavingHIndexSubBlock
+                        glog
+                        quickstep_catalog_CatalogTypedefs
+                        quickstep_compression_CompressionDictionary
+                        quickstep_compression_CompressionDictionaryBuilder
+                        quickstep_expressions_predicate_ComparisonPredicate
+                        quickstep_expressions_predicate_PredicateCost
+                        quickstep_storage_BitWeavingIndexSubBlock
+                        quickstep_storage_CompressedTupleStorageSubBlock
+                        quickstep_storage_StorageBlockInfo
+                        quickstep_storage_StorageBlockLayout_proto
+                        quickstep_storage_SubBlockTypeRegistry
+                        quickstep_storage_SubBlockTypeRegistryMacros
+                        quickstep_storage_TupleStorageSubBlock
+                        quickstep_types_TypedValue
+                        quickstep_types_operations_comparisons_ComparisonID
+                        quickstep_utility_Macros)
+  target_link_libraries(quickstep_storage_BitWeavingIndexSubBlock
+                        glog
+                        quickstep_catalog_CatalogAttribute
+                        quickstep_catalog_CatalogRelationSchema
+                        quickstep_catalog_CatalogTypedefs
+                        quickstep_compression_CompressionDictionary
+                        quickstep_compression_CompressionDictionaryBuilder
+                        quickstep_expressions_predicate_ComparisonPredicate
+                        quickstep_expressions_predicate_Predicate
+                        quickstep_expressions_scalar_Scalar
+                        quickstep_expressions_scalar_ScalarAttribute
+                        quickstep_storage_CompressedStoreUtil
+                        quickstep_storage_CompressedTupleStorageSubBlock
+                        quickstep_storage_IndexSubBlock
+                        quickstep_storage_StorageBlockInfo
+                        quickstep_storage_StorageBlockLayout_proto
+                        quickstep_storage_StorageConstants
+                        quickstep_storage_StorageErrors
+                        quickstep_storage_TupleIdSequence
+                        quickstep_storage_TupleStorageSubBlock
+                        quickstep_storage_ValueAccessor
+                        quickstep_storage_ValueAccessorUtil
+                        quickstep_types_Type
+                        quickstep_types_TypedValue
+                        quickstep_types_operations_comparisons_ComparisonID
+                        quickstep_utility_BitManipulation
+                        quickstep_utility_Macros)
+  target_link_libraries(quickstep_storage_BitWeavingVIndexSubBlock
+                        glog
+                        quickstep_catalog_CatalogTypedefs
+                        quickstep_compression_CompressionDictionary
+                        quickstep_compression_CompressionDictionaryBuilder
+                        quickstep_expressions_predicate_ComparisonPredicate
+                        quickstep_expressions_predicate_PredicateCost
+                        quickstep_storage_BitWeavingIndexSubBlock
+                        quickstep_storage_CompressedTupleStorageSubBlock
+                        quickstep_storage_StorageBlockInfo
+                        quickstep_storage_StorageBlockLayout_proto
+                        quickstep_storage_StorageConstants
+                        quickstep_storage_SubBlockTypeRegistry
+                        quickstep_storage_SubBlockTypeRegistryMacros
+                        quickstep_storage_TupleStorageSubBlock
+                        quickstep_storage_ValueAccessor
+                        quickstep_storage_ValueAccessorUtil
+                        quickstep_types_TypedValue
+                        quickstep_types_operations_comparisons_ComparisonID
+                        quickstep_utility_Macros)
+endif()
+# CMAKE_VALIDATE_IGNORE_END
 target_link_libraries(quickstep_storage_ColumnStoreUtil
                       quickstep_catalog_CatalogAttribute
                       quickstep_catalog_CatalogRelationSchema
@@ -795,6 +876,14 @@ target_link_libraries(quickstep_storage_StorageBlock
                       quickstep_types_operations_comparisons_ComparisonUtil
                       quickstep_utility_Macros
                       quickstep_utility_PtrVector)
+# CMAKE_VALIDATE_IGNORE_BEGIN
+if(QUICKSTEP_HAVE_BITWEAVING)
+  target_link_libraries(quickstep_storage_StorageBlock
+                        quickstep_storage_BitWeavingHIndexSubBlock
+                        quickstep_storage_BitWeavingIndexSubBlock
+                        quickstep_storage_BitWeavingVIndexSubBlock)
+endif()
+# CMAKE_VALIDATE_IGNORE_END
 target_link_libraries(quickstep_storage_StorageBlockBase
                       glog
                       quickstep_storage_StorageBlockInfo
@@ -956,6 +1045,14 @@ elseif (QUICKSTEP_HAVE_FILE_MANAGER_WINDOWS)
   target_link_libraries(quickstep_storage
                         quickstep_storage_FileManagerWindows)
 endif()
+# CMAKE_VALIDATE_IGNORE_BEGIN
+if(QUICKSTEP_HAVE_BITWEAVING)
+  target_link_libraries(quickstep_storage
+                        quickstep_storage_BitWeavingHIndexSubBlock
+                        quickstep_storage_BitWeavingIndexSubBlock
+                        quickstep_storage_BitWeavingVIndexSubBlock)
+endif()
+# CMAKE_VALIDATE_IGNORE_END
 
 # Tests:
 include(CheckTypeSize)
@@ -1094,6 +1191,49 @@ target_link_libraries(BloomFilterIndexSubBlock_unittest
                       ${LIBS})
 add_test(BloomFilterIndexSubBlock_unittest BloomFilterIndexSubBlock_unittest)
 
+if(QUICKSTEP_HAVE_BITWEAVING)
+  add_executable(BitWeavingIndexSubBlock_unittest 
+                 "${CMAKE_CURRENT_SOURCE_DIR}/bitweaving/tests/BitWeavingIndexSubBlock_unittest.cpp")
+  target_link_libraries(BitWeavingIndexSubBlock_unittest
+                        glog
+                        gtest
+                        gtest_main
+                        quickstep_catalog_CatalogAttribute
+                        quickstep_catalog_CatalogRelation
+                        quickstep_catalog_CatalogTypedefs
+                        quickstep_expressions_predicate_ComparisonPredicate
+                        quickstep_expressions_scalar_Scalar
+                        quickstep_expressions_scalar_ScalarAttribute
+                        quickstep_expressions_scalar_ScalarLiteral
+                        quickstep_storage_BitWeavingHIndexSubBlock
+                        quickstep_storage_BitWeavingIndexSubBlock
+                        quickstep_storage_BitWeavingVIndexSubBlock
+                        quickstep_storage_StorageBlock
+                        quickstep_storage_StorageBlockInfo
+                        quickstep_storage_StorageBlockLayout_proto
+                        quickstep_storage_StorageErrors
+                        quickstep_storage_StorageManager
+                        quickstep_storage_TupleIdSequence
+                        quickstep_storage_TupleStorageSubBlock
+                        quickstep_types_CharType
+                        quickstep_types_FloatType
+                        quickstep_types_LongType
+                        quickstep_types_Type
+                        quickstep_types_TypeFactory
+                        quickstep_types_TypeID
+                        quickstep_types_TypedValue
+                        quickstep_types_VarCharType
+                        quickstep_types_containers_Tuple
+                        quickstep_types_operations_comparisons_Comparison
+                        quickstep_types_operations_comparisons_ComparisonFactory
+                        quickstep_types_operations_comparisons_ComparisonID
+                        quickstep_types_operations_comparisons_ComparisonUtil
+                        quickstep_utility_Macros
+                        quickstep_utility_ScopedBuffer
+                        ${LIBS})
+  add_test(BitWeavingIndexSubBlock_unittest BitWeavingIndexSubBlock_unittest)
+endif()
+
 add_executable(CompressedColumnStoreTupleStorageSubBlock_unittest "${CMAKE_CURRENT_SOURCE_DIR}/tests/CompressedColumnStoreTupleStorageSubBlock_unittest.cpp")
 target_link_libraries(CompressedColumnStoreTupleStorageSubBlock_unittest
                       gtest

http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/cbd169e5/storage/IndexSubBlockDescriptionFactory.hpp
----------------------------------------------------------------------
diff --git a/storage/IndexSubBlockDescriptionFactory.hpp b/storage/IndexSubBlockDescriptionFactory.hpp
index a9992ef..5e7f5a1 100644
--- a/storage/IndexSubBlockDescriptionFactory.hpp
+++ b/storage/IndexSubBlockDescriptionFactory.hpp
@@ -28,7 +28,7 @@ namespace quickstep {
  */
 
 /**
- * @brief A class that describes factories of IndexSubBlockDescriptionFactory
+ * @brief A class that describes factories of IndexSubBlockDescriptionFactory.
  */
 class IndexSubBlockDescriptionFactory {
  public:
@@ -51,6 +51,13 @@ class IndexSubBlockDescriptionFactory {
     // Different types of indexes can specify their own validation checks here.
     // Currently these are trivial for CSBTree and SMAIndex.
     switch (index_description.sub_block_type()) {
+      case IndexSubBlockDescription_IndexSubBlockType_BITWEAVING_H:  // Fall through.
+      case IndexSubBlockDescription_IndexSubBlockType_BITWEAVING_V:
+        // Only singular keys are allowed.
+        if (index_description.indexed_attribute_ids_size() == 1) {
+          return true;
+        }
+        return false;
       case IndexSubBlockDescription_IndexSubBlockType_CSB_TREE:
         return true;
       case IndexSubBlockDescription_IndexSubBlockType_SMA:

http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/cbd169e5/storage/StorageBlock.cpp
----------------------------------------------------------------------
diff --git a/storage/StorageBlock.cpp b/storage/StorageBlock.cpp
index fba4d60..476a130 100644
--- a/storage/StorageBlock.cpp
+++ b/storage/StorageBlock.cpp
@@ -63,6 +63,12 @@
 
 #include "glog/logging.h"
 
+#ifdef QUICKSTEP_HAVE_BITWEAVING
+#include "storage/bitweaving/BitWeavingIndexSubBlock.hpp"
+#include "storage/bitweaving/BitWeavingHIndexSubBlock.hpp"
+#include "storage/bitweaving/BitWeavingVIndexSubBlock.hpp"
+#endif
+
 using std::make_pair;
 using std::pair;
 using std::size_t;
@@ -172,8 +178,7 @@ StorageBlock::StorageBlock(const CatalogRelationSchema &relation,
        ++index_num) {
     indices_.push_back(CreateIndexSubBlock(*tuple_store_,
                                            block_header_.layout().index_description(index_num),
-                                           new_block,
-                                           sub_block_address,
+                                           new_block, sub_block_address,
                                            block_header_.index_size(index_num)));
     sub_block_address += block_header_.index_size(index_num);
     if (!indices_.back().supportsAdHocAdd()) {
@@ -1044,6 +1049,25 @@ IndexSubBlock* StorageBlock::CreateIndexSubBlock(
                                   new_block,
                                   sub_block_memory,
                                   sub_block_memory_size);
+#ifdef QUICKSTEP_HAVE_BITWEAVING
+    case IndexSubBlockDescription::BITWEAVING_V:
+      return new BitWeavingVIndexSubBlock(tuple_store,
+                                          description,
+                                          new_block,
+                                          sub_block_memory,
+                                          sub_block_memory_size);
+    case IndexSubBlockDescription::BITWEAVING_H:
+      return new BitWeavingHIndexSubBlock(tuple_store,
+                                          description,
+                                          new_block,
+                                          sub_block_memory,
+                                          sub_block_memory_size);
+#else
+    case IndexSubBlockDescription::BITWEAVING_V:  // Fall through.
+    case IndexSubBlockDescription::BITWEAVING_H:
+      LOG(FATAL) << "Attempted to create a block with a bitweaving index "
+                 << "but Quickstep was not compiled with bitweaving.";
+#endif
     default:
       if (new_block) {
         FATAL_ERROR("A StorageBlockLayout provided an unknown IndexBlockType.");

http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/cbd169e5/storage/StorageBlockInfo.hpp
----------------------------------------------------------------------
diff --git a/storage/StorageBlockInfo.hpp b/storage/StorageBlockInfo.hpp
index ecda854..c18a8a2 100644
--- a/storage/StorageBlockInfo.hpp
+++ b/storage/StorageBlockInfo.hpp
@@ -137,6 +137,8 @@ enum IndexSubBlockType {
   kCSBTree = 0,
   kSMA,
   kBloomFilter,
+  kBitWeavingV,
+  kBitWeavingH,
   kNumIndexSubBlockTypes  // Not an actual IndexSubBlockType, exists for counting purposes.
 };
 

http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/cbd169e5/storage/StorageBlockLayout.proto
----------------------------------------------------------------------
diff --git a/storage/StorageBlockLayout.proto b/storage/StorageBlockLayout.proto
index 571c700..9e13fbe 100644
--- a/storage/StorageBlockLayout.proto
+++ b/storage/StorageBlockLayout.proto
@@ -65,6 +65,8 @@ message IndexSubBlockDescription {
     CSB_TREE = 0;
     SMA = 1;
     BLOOM_FILTER = 2;
+    BITWEAVING_H = 3;
+    BITWEAVING_V = 4;    
   }
 
   required IndexSubBlockType sub_block_type = 1;

http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/cbd169e5/storage/StorageConfig.h.in
----------------------------------------------------------------------
diff --git a/storage/StorageConfig.h.in b/storage/StorageConfig.h.in
index 2344bba..eee1be9 100644
--- a/storage/StorageConfig.h.in
+++ b/storage/StorageConfig.h.in
@@ -15,6 +15,7 @@
  *   limitations under the License.
  **/
 
+#cmakedefine QUICKSTEP_HAVE_BITWEAVING
 #cmakedefine QUICKSTEP_HAVE_FILE_MANAGER_POSIX
 #cmakedefine QUICKSTEP_HAVE_FILE_MANAGER_WINDOWS
 #cmakedefine QUICKSTEP_HAVE_FILE_MANAGER_HDFS

http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/cbd169e5/storage/SubBlockTypeRegistry.cpp
----------------------------------------------------------------------
diff --git a/storage/SubBlockTypeRegistry.cpp b/storage/SubBlockTypeRegistry.cpp
index 35ee502..f519c73 100644
--- a/storage/SubBlockTypeRegistry.cpp
+++ b/storage/SubBlockTypeRegistry.cpp
@@ -82,6 +82,28 @@ bool SubBlockTypeRegistry::LayoutDescriptionIsValid(
   return true;
 }
 
+bool SubBlockTypeRegistry::IndexDescriptionIsValid(
+      const CatalogRelationSchema &relation,
+      const IndexSubBlockDescription &description) {
+  if (!description.IsInitialized()) {
+    return false;
+  }
+
+  std::unordered_map<IndexTypeIntegral,
+                     IndexDescriptionIsValidFunction>::const_iterator
+      index_it = Instance()->index_description_is_valid_functions_.find(
+          static_cast<IndexTypeIntegral>(description.sub_block_type()));
+  // No validity function was registered.
+  if (index_it == Instance()->index_description_is_valid_functions_.end()) {
+    return false;
+  }
+
+  if (!(*index_it->second)(relation, description)) {
+    return false;
+  }
+  return true;
+}
+
 std::size_t SubBlockTypeRegistry::EstimateBytesPerTupleForTupleStore(
     const CatalogRelationSchema &relation,
     const TupleStorageSubBlockDescription &description) {

http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/cbd169e5/storage/SubBlockTypeRegistry.hpp
----------------------------------------------------------------------
diff --git a/storage/SubBlockTypeRegistry.hpp b/storage/SubBlockTypeRegistry.hpp
index a223e7c..e930fb4 100644
--- a/storage/SubBlockTypeRegistry.hpp
+++ b/storage/SubBlockTypeRegistry.hpp
@@ -142,6 +142,10 @@ class SubBlockTypeRegistry {
       const CatalogRelationSchema &relation,
       const StorageBlockLayoutDescription &description);
 
+  static bool IndexDescriptionIsValid(
+      const CatalogRelationSchema &relation,
+      const IndexSubBlockDescription &description);
+
   static std::size_t EstimateBytesPerTupleForTupleStore(
       const CatalogRelationSchema &relation,
       const TupleStorageSubBlockDescription &description);

http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/cbd169e5/validate_cmakelists.py
----------------------------------------------------------------------
diff --git a/validate_cmakelists.py b/validate_cmakelists.py
index a064a1c..c7b5883 100755
--- a/validate_cmakelists.py
+++ b/validate_cmakelists.py
@@ -42,12 +42,16 @@ EXCLUDED_TOP_LEVEL_DIRS = ["build", "third_party"]
 IGNORED_DEPENDENCIES = frozenset(
     ["quickstep_threading_WinThreadsAPI",
      "quickstep_utility_textbasedtest_TextBasedTest",
-     "quickstep_utility_textbasedtest_TextBasedTestDriver"])
+     "quickstep_utility_textbasedtest_TextBasedTestDriver",
+     "quickstep_storage_bitweaving_BitWeavingHIndexSubBlock",
+     "quickstep_storage_bitweaving_BitWeavingIndexSubBlock",
+     "quickstep_storage_bitweaving_BitWeavingVIndexSubBlock"])
 
 # States when scanning a CMakeLists.txt file.
 CMAKE_SCANNING_NONE = 0
 CMAKE_SCANNING_LIBRARY = 1
 CMAKE_SCANNING_TARGET_LINK_LIBRARIES = 2
+CMAKE_SCANNING_IGNORE = 3
 
 def convert_path_to_targetname(include_path):
     """Convert an included header file's path to a quickstep library target in
@@ -315,10 +319,26 @@ def process_cmakelists_file(cmakelists_filename, qs_module_dirs):
     skipped_targets = set()
     generated_targets = set()
     scan_state = CMAKE_SCANNING_NONE
+    previous_state = CMAKE_SCANNING_NONE
     stitched_string = ""
     with open(cmakelists_filename, "r") as cmakelists_file:
         for line in cmakelists_file:
-            if scan_state == CMAKE_SCANNING_NONE:
+            if ("CMAKE_VALIDATE_IGNORE_BEGIN" in line and
+                scan_state != CMAKE_SCANNING_IGNORE):
+                previous_state = scan_state
+                scan_state = CMAKE_SCANNING_IGNORE
+                continue
+
+            if scan_state == CMAKE_SCANNING_IGNORE:
+                if "CMAKE_VALIDATE_IGNORE_END" in line:
+                    scan_state = previous_state
+                elif "CMAKE_VALIDATE_IGNORE_BEGIN" in line:
+                    print "Nested IGNORE_BEGIN directives found in: "\
+                        + cmakelists_filename + ", exiting"
+                    exit(-1)
+                else:
+                    continue
+            elif scan_state == CMAKE_SCANNING_NONE:
                 add_library_pos = line.find("add_library(")
                 if add_library_pos != -1:
                     scan_state = CMAKE_SCANNING_LIBRARY