のテキストインデックスがどのように機能するのか理解していないようですIxSet
。tags
ここでは、フィールドごとにアイテムのインデックスを作成し、タグ「タグ」ごとにアイテムをクエリする単体テストを作成しました。(私の観点からは)3つのアイテムすべてが返されるはずです(すべてタグ「タグ」があるため)が、そうではないようです。そして、その理由がわかりません。
{-# LANGUAGE DeriveDataTypeable #-}
import Test.HUnit
import Data.IxSet
import Data.List.Split ( splitOn )
import Data.Data ( Data, Typeable )
data TaggedItem = TaggedItem { getTags :: String }
deriving ( Show, Ord, Eq, Data, Typeable )
data Tag = Tag String
deriving ( Show, Ord, Eq, Data, Typeable )
getTagStrings :: TaggedItem -> [Tag]
getTagStrings = map Tag . splitOn "," . getTags
instance Indexable TaggedItem where
empty = ixSet
[ ixFun getTagStrings ]
test3 = TestCase (
assertEqual "ixFun multiple tags test"
3
(size (index @= (Tag "tag"))) )
where items = [ TaggedItem "tag,tag1,tag2"
, TaggedItem "tag,tag1,tag2"
, TaggedItem "tag,tag1,tag2" ]
index = fromList items
tests = TestList [
-- TestLabel "test1" test1,
-- TestLabel "test2" test2,
TestLabel "test3" test3]
main = do
runTestTT tests
アップデート:
うーん、かなり面白い。フィールド「name」を追加し、各アイテム名を異なるものにしたので、動作するようになりました。
{-# LANGUAGE DeriveDataTypeable #-}
import Test.HUnit
import Data.IxSet
import Data.List.Split ( splitOn )
import Data.Data ( Data, Typeable )
newtype TaggedItemName = TaggedItemName { unTaggedItemName :: String }
deriving ( Show, Ord, Eq, Data, Typeable )
data TaggedItem = TaggedItem { getName :: TaggedItemName, getTags :: String }
deriving ( Show, Ord, Eq, Data, Typeable )
data Tag = Tag String
deriving ( Show, Ord, Eq, Data, Typeable )
getTagStrings :: TaggedItem -> [Tag]
getTagStrings = map Tag . splitOn "," . getTags
instance Indexable TaggedItem where
empty = ixSet
[ ixFun getTagStrings ]
test3 = TestCase (
assertEqual "ixFun multiple tags test"
3
(size (index @= (Tag "tag"))) )
where items = [ TaggedItem (TaggedItemName "name1") "tag,tag1,tag2"
, TaggedItem (TaggedItemName "name2") "tag,tag1,tag2"
, TaggedItem (TaggedItemName "name3") "tag,tag1,tag2" ]
index = fromList items
tests = TestList [
-- TestLabel "test1" test1,
-- TestLabel "test2" test2,
TestLabel "test3" test3]
main = do
runTestTT tests
動作します。したがって、IxSetはそれらのアイテムを同じものと見なし、何らかの方法でそれらをマージした可能性があります(?)