http://git-wip-us.apache.org/repos/asf/cassandra/blob/72790dc8/test/resources/tokenization/apache_license_header.txt
----------------------------------------------------------------------
diff --git a/test/resources/tokenization/apache_license_header.txt 
b/test/resources/tokenization/apache_license_header.txt
new file mode 100644
index 0000000..d973dce
--- /dev/null
+++ b/test/resources/tokenization/apache_license_header.txt
@@ -0,0 +1,16 @@
+/*
+ * 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.
+ */
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cassandra/blob/72790dc8/test/resources/tokenization/ja_jp_1.txt
----------------------------------------------------------------------
diff --git a/test/resources/tokenization/ja_jp_1.txt 
b/test/resources/tokenization/ja_jp_1.txt
new file mode 100644
index 0000000..1a0a198
--- /dev/null
+++ b/test/resources/tokenization/ja_jp_1.txt
@@ -0,0 +1 @@
+古写本は題名の記されていないものも多く、記されているå
 ´åˆã§ã‚っても内容はさまざまである。『源氏物語』のå 
´åˆã¯å†Šå­ã®æ¨™é¡Œã¨ã—て「源氏物語」ないしそれに相当する物語å
…¨ä½“の標題が記されているå 
´åˆã‚ˆã‚Šã‚‚、それぞれの帖名が記されていることが少なくない。こうした経緯から、現在において一般に『源氏物語』と呼ばれているこの物語が書かれた当時の題名が何であったのかは明らかではない。古い時代の写本や注釈書などの文献に記されている名称は大きく以下の系統に分かれる。
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cassandra/blob/72790dc8/test/resources/tokenization/ja_jp_2.txt
----------------------------------------------------------------------
diff --git a/test/resources/tokenization/ja_jp_2.txt 
b/test/resources/tokenization/ja_jp_2.txt
new file mode 100644
index 0000000..278b4fd
--- /dev/null
+++ b/test/resources/tokenization/ja_jp_2.txt
@@ -0,0 +1,2 @@
+中野幸一編『常用 
源氏物語要覧』武蔵野書院、1997年(平成9年)。 ISBN 
4-8386-0383-5
+その他にCD-ROM化された本文検索システム
として次のようなものがある。
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cassandra/blob/72790dc8/test/resources/tokenization/lorem_ipsum.txt
----------------------------------------------------------------------
diff --git a/test/resources/tokenization/lorem_ipsum.txt 
b/test/resources/tokenization/lorem_ipsum.txt
new file mode 100644
index 0000000..14a4477
--- /dev/null
+++ b/test/resources/tokenization/lorem_ipsum.txt
@@ -0,0 +1 @@
+"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod 
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, 
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo 
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse 
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non 
proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cassandra/blob/72790dc8/test/resources/tokenization/ru_ru_1.txt
----------------------------------------------------------------------
diff --git a/test/resources/tokenization/ru_ru_1.txt 
b/test/resources/tokenization/ru_ru_1.txt
new file mode 100644
index 0000000..c19a9be
--- /dev/null
+++ b/test/resources/tokenization/ru_ru_1.txt
@@ -0,0 +1,19 @@
+Вэл фабулаз эффикеэнди витюпэраторебуз 
эи, кюм нобёз дикырыт ёнвидюнт ед. Ючю золэт 
ийжквюы эа, нык но элитр волуптюа 
пэркёпитюр. Ыт векж декам плььатонэм, эа 
жюмо ёудёкабет льебэравичсы квуй, 
альбюкиюс лыгэндоч эю пэр. Еюж ед аутым 
нюмквуам тебиквюэ, эи амэт дэбыт нюлльам 
квюо. Ку золэт пондэрюм элььэефэнд хаж, вяш 
ёнвидюнт дыфинитеоным экз, конгуы кытэрож 
квюо ат.
+
+Ад фиэрэнт ыкжплььикари нык, ут дольорэ 
емпэтюсъ зыд. Зыд ажжюм пэржыкюти 
жкряпшэрит эю, ыюм ан витаэ аляквюид 
дяшзынтиыт. Вэл квюандо ридэнж эю. Еюж 
жэмпэр конклььюжионэмквуэ нэ.
+
+Ку хёз порро тамквюам плььатонэм, льаборэ 
ыпикурэи вэл ты. Но ентэгры компльыктётюр 
мэя, дуо жанктюч дэльэнйт льебэравичсы нэ. 
Эжт фалля пропрёаы эю, эож вэрыар ёнэрмйщ 
ан. Мюндй контынтёонэж прё ат. Эрож 
копиожаы пытынтёюм шэа эи.
+
+Но мэль омниюм рэпудёандаэ. Дуо ты квюот 
июварыт, ты векж квюаэчтио альиквуандо, эю 
мэльёуз трактатоз пхйложопхяа векж. Ед нам 
нюлльам губэргрэн, ты оратио иреуры 
коммюны пэр, векж ед золэт убяквюэ 
чингюльищ. Мэльёуз граэкйж вольуптатибюж 
мэя ед, одео емпыдит майыжтатйж эож ыт, эа 
дйкит зальутанде квюальизквюэ ючю. Йн еюж 
анкилльаы аккоммодары, ан выльёт оптёон 
ывыртятюр вэл.
+
+Йн граэко дычэрунт мандамюч мыа. Но про 
щольыат примич, нык ан этёам дольорэ 
элььэефэнд. Ыам нэ квюандо нощтыр. Ныморэ 
дикунт ад хаж, хаж квюод дёко эуежмод ты, 
амэт дыфинитеоным еюж ыт. Эжт ад апэряря 
апыирёан, кюм зальы рэктэквуэ нэ.
+
+Эи эрюдитя факёльиси еюж, ыам дольорэ 
фабулаз вокябюч ат. Про опортэры 
азжюывырит йн. Мовэт аюдиам ючю эю, нэ 
едквюэ пэркйпет квюальизквюэ хёз. Эа кюм 
этёам ырант граэкы. Эю прё модо эпикюре 
жплэндидэ, ат ыюм фалля пожтэа пхаэдрум, 
чтэт вэрйтюж нэ вим. Конгуы оратио лобортис 
ут кюм. Нобёз опортэат но жят, вэрйтюж 
пэркйпет мальюизчыт квуй ан.
+
+Мацим ютенам рыфэррэнтур вим ат. Ку квюо 
квюач дигнижжим, одео жольюта тебиквюэ мыа 
ыт. Ед нобёз тантаз льаорыыт вэл, еюж йн 
латины фабулаз аккюжамюз, прё апыирёан 
адолэжкэнс пожйдонёюм ты. Консэквюат 
котёдиэквюэ ыюм ан, хёз ут хабымуч ыпикурэи 
чэнзэрет. Ат квуй дэбыт вирйз, нам эю ыльит 
фабыллас дэлььякатезшимя. Кончюлату 
инзтруктеор эа кюм, конжюль фэюгаят 
кончюлату ут ыам, вяш эи фэюгаят антеопам.
+
+Юллюм оратио консэквюат ут вэл, выльёт 
рыпудяары хэндрэрет эю прё. Унюм 
ыкчпэтында торквюатоз ад векж. Квюо мютат 
тебиквюэ факильизиж эи, эа ыам фюгит 
такематыш дяшзынтиыт, экз про абхоррэант 
дйжпютандо. Ку хаж льабятюр эрепюят, 
нолюёжжэ ёудёкабет пэр эю. Тота долорюм 
азжюывырит прё ут, нык зальы элитр дикырыт 
эю. Ед дуо ыкжплььикари мныжаркхюм 
конклььюжионэмквуэ.
+
+Кончюлату азжюывырит нэ зыд. Вэл но квуым 
граэкйж юрбанйтаж. Про эффякиантур 
дэфянятйоныс ут, зюаз эрат конкыптам векж 
эю. Юллюм зюжкепиантюр экз прё, оратио 
нонумй орнатюс эи эож. Эож такематыш 
чэнзэрет ад, ат факилиз пэркйпет пэржыкюти 
нык, аппарэат рэктэквуэ экз зыд. Кюм йн 
вёвындо дэтракто окюррырэт.
+
+Шэа рыквюы щольыат фабыллас ты, хаж выльёт 
эффякиантур компрэхэнжам ат. Ты мэя эзшэ 
ажжюм апыирёан, ат докэндё конкыптам еюж. 
Ножтрюд жанктюч ывыртятюр ты вяш, но примич 
промпта пэрчыквюэрёж дуо. Выро мютат 
омнэжквюы ыам эю.
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cassandra/blob/72790dc8/test/resources/tokenization/top_visited_domains.txt
----------------------------------------------------------------------
diff --git a/test/resources/tokenization/top_visited_domains.txt 
b/test/resources/tokenization/top_visited_domains.txt
new file mode 100644
index 0000000..0238c36
--- /dev/null
+++ b/test/resources/tokenization/top_visited_domains.txt
@@ -0,0 +1,3 @@
+google.com facebook.com youtube.com yahoo.com baidu.com amazon.com 
wikipedia.org taobao.com twitter.com Qq.com google.co.in apple.com
+
+http://www.alexa.com/topsites
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cassandra/blob/72790dc8/test/resources/tokenization/zn_tw_1.txt
----------------------------------------------------------------------
diff --git a/test/resources/tokenization/zn_tw_1.txt 
b/test/resources/tokenization/zn_tw_1.txt
new file mode 100644
index 0000000..7e1e545
--- /dev/null
+++ b/test/resources/tokenization/zn_tw_1.txt
@@ -0,0 +1,19 @@
+銌鞁鬿 蝑蝞蝢 砫粍紞 顃餭 蜭, 趍跠跬 鏀顝饇 轞騹鼚 曨曣 
慔 巆忁 嫷 惝掭掝 鑳鱨鱮, 滆 浶洯浽 牣犿玒 嶕憱撏 駇僾 
憱撏 硾 湹渵焲 鋧鋓頠 匊呥 犌犐瑆 翣聜蒢 蜙, 毼 噳墺 
耇胇赲 稨窨箌 埱娵徖, 鍆錌雔 熩熝犚 庲悊 槄 銌鞁鬿 
烍烚珜 疿疶砳 魆 糑縒 魦 萴葂 貄趎跰 萰葍萯, 嗛嗕塨 礂簅
縭 婜孲 跣, 楋 澭濇 嗢嗂塝 姌弣抶 曋橪橤
+
+崺崸 獧瞝瞣 牣犿玒 嫷, 墆 齴讘麡 毊灚襳 毚丮厹 甿虮 箯 
埱娵 脀蚅蚡 礯籔羻 鈁陾靰, 垼娕 螏螉褩 竀篴臌 槶, 鵳齖齘 
驐鷑鷩 絒翗腏 輗 嬦憼 耜僇鄗 訬軗郲 舿萐菿 頠餈 槶, 抰枅 
嬃 軹軦軵 鸙讟钃 椵楘溍 渳湥牋 蔝蓶蓨 跜軥 嫀, 砯砨 嗢 
鄨鎷闒 縓罃蔾, 鍹餳駷 玝甿虮 熩熝犚 碡碙 銇
+
+瞝瞣 莃荶衒 碄碆碃 樆樦潏 穊, 枲柊氠 婰婜孲 踣 繗繓 
犈犆犅 溗煂獂 儋圚 餀, 蟷蠉蟼 禒箈箑 牬玾 槶 玾珆玸 
錖霒馞 撖 姴怤 犆犅 鳻嶬幧 誁趏跮 墐
+
+墐 鬵鵛嚪 圩芰敔 蒝蒧蓏 餳駷, 葮 廘榙 斶檎檦 謺貙蹖 澉 
駍駔鳿 蒝蒧蓏 蔊蓴蔖 垌壴, 煻 垺垼娕 簻臗藱 笓粊 絼 騉鬵 
樛槷殦 縸縩薋 巕氍爟, 璸瓁穟 鯦鯢鯡 罫蓱蒆 齥廲 滘 鯠鯦 
噮噦噞 忁曨曣 釂鱞鸄 鉌 寔嵒 葮 瀿犨皫 顤鰩鷎, 憢 蔏蔍蓪 
柦柋牬 玝甿虮 偢偣
+
+嗂 蒏葝葮 鋱鋟鋈 鬄鵊鵙 繖藒 毚丮 匢奾灱 枲柊氠 椵楘溍 
斠, 鬄鵊 鼏噳墺 巕氍爟 鋟, 鳱 鵳齖齘 雥齆犪 騧騜 轞騹鼚 
溗煂獂 諙 岵帔, 煻 廦廥彋 繠繗繓 馦騧騜 齖齘 煘煓 喥喓堮 
軹軦軵 壿, 斖蘱 酳 圛嬖嬨 姛帡恦, 摿斠榱 櫧櫋瀩 廅愮揫 
驧鬤 跾
+
+綒 鞻饙騴 萆覕貹 稘稒稕 稢綌 笢笣紽 磃箹糈 瑽 氕厊, 
剆坲 禖 鶀嚵巆 枅杺枙, 郔镺陯 烗猀珖 伒匢 殟 憢 箛箙 
馺骱魡 潧潣瑽 觶譈譀 塝 豥趍 捘栒毤 幨懅憴 稘稒稕, 
撖撱暲 駓駗鴀 鄻鎟霣 蝯 訑紱 縢羱 槏殟殠 浘涀缹 鄻鎟霣 
輘, 籺籿 媝寔嵒 樧槧樈 焟硱筎 瞂
+
+蚔趵郚 碄碆碃 幋 璻甔 輘 裧頖 簎艜薤 鑤仜伒 誽賚賧 淠淉 
鄜酳銪 炾笀耔 椵楘溍 魡 疿疶砳 趡趛踠 躨钀钁 馺 哤垽 
庌弝彶 譋轐鏕 毄滱漮 踣 墡嬇, 賗 鯦鯢鯡 齈龘墻 輘輠 
蕡蕇蕱 襛襡襙 隒雸頍 紒翀 楋, 殠漊 皾籈譧 磩磟窱 狅妵妶 
榎
+
+釂鱞 禠 袟袘觕 餈餖駜 椵楘溍 銈 欿殽 鬵鵛嚪 鬎鯪鯠 礂簅
縭, 彃 嶝仉圠 裍裚詷 莃荶 茺苶 趍跠跬 燚璒瘭 廲籗糴 殠 
魦魵 姛帡恦 賌輈鄍 沀皯竻 墏, 橁橖澭 牣犿玒 捃挸栚 酳 
劻穋 噮噦噞 獧瞝瞣 釂鱞 暕, 蝺 葝葮 壾嵷幓 褣諝趥
+
+跿 鮛鮥鴮 燲獯璯 鵵鵹鵿 唗哱 蓪 塛嫆嫊 邆錉霋 哤垽, 
瀁瀎 馺骱魡 鏾鐇闠 闟顣飁 墆, 壾嵷幓 摬摙敳 鵳齖齘 歅 
鋄銶 澂 櫞氌瀙 忕汌卣 蠁襏 斶檎檦 觶譈譀 釪傛 瑽, 觾韄鷡 
輐銛靾 廞 袚觙 剆坲姏 鼏噳墺 榯槄 觢, 榎 鷃黫鼱 蛚袲褁 
闟顣飁 饙騴, 諙踣踙 齸圞趲 鄜 鶾鷃 驐鷑鷩 禒箈箑 痵 
娭屔, 蓨蝪 譋轐鏕 蔪蓩蔮 楋
+
+褅褌諃 蛃袚觙 傎圌媔 侹厗 榃, 緦 恦拻 杍肜阰 軥軱逴 緷 
摲摓 郔镺陯 揈敜敥, 誙賗跿 彔抳抰 袀豇貣 蜬蝁 榎 傎圌 
圛嬖嬨 鑴鱱爧 潣, 枲柊 誙賗跿 貵趀跅 鮂鮐嚃 溿 禖 笓粊 
齴讘麡 漻漍犕 趡趛踠, 廞 騩鰒鰔 峷敊浭 烒珛
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cassandra/blob/72790dc8/test/unit/org/apache/cassandra/SchemaLoader.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/SchemaLoader.java 
b/test/unit/org/apache/cassandra/SchemaLoader.java
index e375990..51db4cd 100644
--- a/test/unit/org/apache/cassandra/SchemaLoader.java
+++ b/test/unit/org/apache/cassandra/SchemaLoader.java
@@ -21,6 +21,9 @@ import java.io.File;
 import java.io.IOException;
 import java.util.*;
 
+import org.apache.cassandra.dht.Murmur3Partitioner;
+import org.apache.cassandra.index.sasi.SASIIndex;
+import org.apache.cassandra.index.sasi.disk.OnDiskIndexBuilder;
 import org.junit.After;
 import org.junit.BeforeClass;
 
@@ -249,6 +252,8 @@ public class SchemaLoader
                         + "WITH COMPACT STORAGE", ks_cql)
         )));
 
+        if (DatabaseDescriptor.getPartitioner() instanceof Murmur3Partitioner)
+            schema.add(KeyspaceMetadata.create("sasi", 
KeyspaceParams.simpleTransient(1), Tables.of(sasiCFMD("sasi", "test_cf"), 
clusteringSASICFMD("sasi", "clustering_test_cf"))));
 
         if 
(Boolean.parseBoolean(System.getProperty("cassandra.test.compression", 
"false")))
             useCompression(schema);
@@ -475,6 +480,140 @@ public class SchemaLoader
                                                         
.compression(getCompressionParameters());
     }
 
+    public static CFMetaData sasiCFMD(String ksName, String cfName)
+    {
+        CFMetaData cfm = CFMetaData.Builder.create(ksName, cfName)
+                                           .addPartitionKey("id", 
UTF8Type.instance)
+                                           .addRegularColumn("first_name", 
UTF8Type.instance)
+                                           .addRegularColumn("last_name", 
UTF8Type.instance)
+                                           .addRegularColumn("age", 
Int32Type.instance)
+                                           .addRegularColumn("height", 
Int32Type.instance)
+                                           .addRegularColumn("timestamp", 
LongType.instance)
+                                           .addRegularColumn("address", 
UTF8Type.instance)
+                                           .addRegularColumn("score", 
DoubleType.instance)
+                                           .addRegularColumn("comment", 
UTF8Type.instance)
+                                           
.addRegularColumn("comment_suffix_split", UTF8Type.instance)
+                                           
.addRegularColumn("/output/full-name/", UTF8Type.instance)
+                                           
.addRegularColumn("/data/output/id", UTF8Type.instance)
+                                           
.addRegularColumn("first_name_prefix", UTF8Type.instance)
+                                           .build();
+
+        cfm.indexes(cfm.getIndexes()
+                        .with(IndexMetadata.fromSchemaMetadata("first_name", 
IndexMetadata.Kind.CUSTOM, new HashMap<String, String>()
+                        {{
+                            put(IndexTarget.CUSTOM_INDEX_OPTION_NAME, 
SASIIndex.class.getName());
+                            put(IndexTarget.TARGET_OPTION_NAME, "first_name");
+                            put("mode", 
OnDiskIndexBuilder.Mode.CONTAINS.toString());
+                        }}))
+                        .with(IndexMetadata.fromSchemaMetadata("last_name", 
IndexMetadata.Kind.CUSTOM, new HashMap<String, String>()
+                        {{
+                            put(IndexTarget.CUSTOM_INDEX_OPTION_NAME, 
SASIIndex.class.getName());
+                            put(IndexTarget.TARGET_OPTION_NAME, "last_name");
+                            put("mode", 
OnDiskIndexBuilder.Mode.CONTAINS.toString());
+                        }}))
+                        .with(IndexMetadata.fromSchemaMetadata("age", 
IndexMetadata.Kind.CUSTOM, new HashMap<String, String>()
+                        {{
+                            put(IndexTarget.CUSTOM_INDEX_OPTION_NAME, 
SASIIndex.class.getName());
+                            put(IndexTarget.TARGET_OPTION_NAME, "age");
+
+                        }}))
+                        .with(IndexMetadata.fromSchemaMetadata("timestamp", 
IndexMetadata.Kind.CUSTOM, new HashMap<String, String>()
+                        {{
+                            put(IndexTarget.CUSTOM_INDEX_OPTION_NAME, 
SASIIndex.class.getName());
+                            put(IndexTarget.TARGET_OPTION_NAME, "timestamp");
+                            put("mode", 
OnDiskIndexBuilder.Mode.SPARSE.toString());
+
+                        }}))
+                        .with(IndexMetadata.fromSchemaMetadata("address", 
IndexMetadata.Kind.CUSTOM, new HashMap<String, String>()
+                        {{
+                            put("analyzer_class", 
"org.apache.cassandra.index.sasi.analyzer.NonTokenizingAnalyzer");
+                            put(IndexTarget.CUSTOM_INDEX_OPTION_NAME, 
SASIIndex.class.getName());
+                            put(IndexTarget.TARGET_OPTION_NAME, "address");
+                            put("mode", 
OnDiskIndexBuilder.Mode.PREFIX.toString());
+                            put("case_sensitive", "false");
+                        }}))
+                        .with(IndexMetadata.fromSchemaMetadata("score", 
IndexMetadata.Kind.CUSTOM, new HashMap<String, String>()
+                        {{
+                            put(IndexTarget.CUSTOM_INDEX_OPTION_NAME, 
SASIIndex.class.getName());
+                            put(IndexTarget.TARGET_OPTION_NAME, "score");
+                        }}))
+                        .with(IndexMetadata.fromSchemaMetadata("comment", 
IndexMetadata.Kind.CUSTOM, new HashMap<String, String>()
+                        {{
+                            put(IndexTarget.CUSTOM_INDEX_OPTION_NAME, 
SASIIndex.class.getName());
+                            put(IndexTarget.TARGET_OPTION_NAME, "comment");
+                            put("analyzed", "true");
+                        }}))
+                        
.with(IndexMetadata.fromSchemaMetadata("comment_suffix_split", 
IndexMetadata.Kind.CUSTOM, new HashMap<String, String>()
+                        {{
+                            put(IndexTarget.CUSTOM_INDEX_OPTION_NAME, 
SASIIndex.class.getName());
+                            put(IndexTarget.TARGET_OPTION_NAME, 
"comment_suffix_split");
+                            put("mode", 
OnDiskIndexBuilder.Mode.CONTAINS.toString());
+                            put("analyzed", "false");
+                        }}))
+                        
.with(IndexMetadata.fromSchemaMetadata("output_full_name", 
IndexMetadata.Kind.CUSTOM, new HashMap<String, String>()
+                        {{
+                            put(IndexTarget.CUSTOM_INDEX_OPTION_NAME, 
SASIIndex.class.getName());
+                            put(IndexTarget.TARGET_OPTION_NAME, 
"/output/full-name/");
+                            put("analyzed", "true");
+                            put("analyzer_class", 
"org.apache.cassandra.index.sasi.analyzer.NonTokenizingAnalyzer");
+                            put("case_sensitive", "false");
+                        }}))
+                        
.with(IndexMetadata.fromSchemaMetadata("data_output_id", 
IndexMetadata.Kind.CUSTOM, new HashMap<String, String>()
+                        {{
+                            put(IndexTarget.CUSTOM_INDEX_OPTION_NAME, 
SASIIndex.class.getName());
+                            put(IndexTarget.TARGET_OPTION_NAME, 
"/data/output/id");
+                            put("mode", 
OnDiskIndexBuilder.Mode.CONTAINS.toString());
+                        }}))
+                        
.with(IndexMetadata.fromSchemaMetadata("first_name_prefix", 
IndexMetadata.Kind.CUSTOM, new HashMap<String, String>()
+                        {{
+                            put(IndexTarget.CUSTOM_INDEX_OPTION_NAME, 
SASIIndex.class.getName());
+                            put(IndexTarget.TARGET_OPTION_NAME, 
"first_name_prefix");
+                            put("analyzed", "true");
+                            put("tokenization_normalize_lowercase", "true");
+                        }})));
+
+        return cfm;
+    }
+
+    public static CFMetaData clusteringSASICFMD(String ksName, String cfName)
+    {
+        CFMetaData cfm = CFMetaData.Builder.create(ksName, cfName)
+                                           .addPartitionKey("name", 
UTF8Type.instance)
+                                           .addClusteringColumn("location", 
UTF8Type.instance)
+                                           .addClusteringColumn("age", 
Int32Type.instance)
+                                           .addRegularColumn("height", 
Int32Type.instance)
+                                           .addRegularColumn("score", 
DoubleType.instance)
+                                           .build();
+
+        cfm.indexes(cfm.getIndexes()
+                       .with(IndexMetadata.fromSchemaMetadata("location", 
IndexMetadata.Kind.CUSTOM, new HashMap<String, String>()
+                       {{
+                           put(IndexTarget.CUSTOM_INDEX_OPTION_NAME, 
SASIIndex.class.getName());
+                           put(IndexTarget.TARGET_OPTION_NAME, "location");
+                           put("mode", 
OnDiskIndexBuilder.Mode.PREFIX.toString());
+                       }}))
+                       .with(IndexMetadata.fromSchemaMetadata("age", 
IndexMetadata.Kind.CUSTOM, new HashMap<String, String>()
+                       {{
+                           put(IndexTarget.CUSTOM_INDEX_OPTION_NAME, 
SASIIndex.class.getName());
+                           put(IndexTarget.TARGET_OPTION_NAME, "age");
+                           put("mode", 
OnDiskIndexBuilder.Mode.PREFIX.toString());
+                       }}))
+                       .with(IndexMetadata.fromSchemaMetadata("height", 
IndexMetadata.Kind.CUSTOM, new HashMap<String, String>()
+                       {{
+                           put(IndexTarget.CUSTOM_INDEX_OPTION_NAME, 
SASIIndex.class.getName());
+                           put(IndexTarget.TARGET_OPTION_NAME, "height");
+                           put("mode", 
OnDiskIndexBuilder.Mode.PREFIX.toString());
+                       }}))
+                       .with(IndexMetadata.fromSchemaMetadata("score", 
IndexMetadata.Kind.CUSTOM, new HashMap<String, String>()
+                       {{
+                           put(IndexTarget.CUSTOM_INDEX_OPTION_NAME, 
SASIIndex.class.getName());
+                           put(IndexTarget.TARGET_OPTION_NAME, "score");
+                           put("mode", 
OnDiskIndexBuilder.Mode.PREFIX.toString());
+                       }})));
+
+        return cfm;
+    }
+
     public static CompressionParams getCompressionParameters()
     {
         return getCompressionParameters(null);

http://git-wip-us.apache.org/repos/asf/cassandra/blob/72790dc8/test/unit/org/apache/cassandra/cql3/KeyCacheCqlTest.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/cql3/KeyCacheCqlTest.java 
b/test/unit/org/apache/cassandra/cql3/KeyCacheCqlTest.java
index 54d39b1..2529de1 100644
--- a/test/unit/org/apache/cassandra/cql3/KeyCacheCqlTest.java
+++ b/test/unit/org/apache/cassandra/cql3/KeyCacheCqlTest.java
@@ -22,6 +22,7 @@ import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
+import java.util.concurrent.Callable;
 
 import org.junit.Assert;
 import org.junit.Test;
@@ -29,6 +30,7 @@ import org.junit.Test;
 import org.apache.cassandra.cache.KeyCacheKey;
 import org.apache.cassandra.config.Schema;
 import org.apache.cassandra.db.Keyspace;
+import org.apache.cassandra.index.Index;
 import org.apache.cassandra.metrics.CacheMetrics;
 import org.apache.cassandra.metrics.CassandraMetricsRegistry;
 import org.apache.cassandra.service.CacheService;
@@ -407,7 +409,7 @@ public class KeyCacheCqlTest extends CQLTester
         if (index != null)
         {
             StorageService.instance.disableAutoCompaction(KEYSPACE, table + 
'.' + index);
-            
Keyspace.open(KEYSPACE).getColumnFamilyStore(table).indexManager.getIndexByName(index).getBlockingFlushTask().call();
+            
triggerBlockingFlush(Keyspace.open(KEYSPACE).getColumnFamilyStore(table).indexManager.getIndexByName(index));
         }
 
         for (int i = 0; i < 100; i++)
@@ -432,7 +434,7 @@ public class KeyCacheCqlTest extends CQLTester
             {
                 
Keyspace.open(KEYSPACE).getColumnFamilyStore(table).forceFlush().get();
                 if (index != null)
-                    
Keyspace.open(KEYSPACE).getColumnFamilyStore(table).indexManager.getIndexByName(index).getBlockingFlushTask().call();
+                    
triggerBlockingFlush(Keyspace.open(KEYSPACE).getColumnFamilyStore(table).indexManager.getIndexByName(index));
             }
         }
     }
@@ -464,4 +466,12 @@ public class KeyCacheCqlTest extends CQLTester
         Assert.assertEquals(0L, metrics.requests.getCount());
         Assert.assertEquals(0L, metrics.size.getValue().longValue());
     }
+
+    private static void triggerBlockingFlush(Index index) throws Exception
+    {
+        assert index != null;
+        Callable<?> flushTask = index.getBlockingFlushTask();
+        if (flushTask != null)
+            flushTask.call();
+    }
 }

Reply via email to