4

のテキストインデックスがどのように機能するのか理解していないようですIxSettagsここでは、フィールドごとにアイテムのインデックスを作成し、タグ「タグ」ごとにアイテムをクエリする単体テストを作成しました。(私の観点からは)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はそれらのアイテムを同じものと見なし、何らかの方法でそれらをマージした可能性があります(?)

4

1 に答える 1

4

はい、IxSet は等しい値をマージしているようです。最初の例を取り上げて、次のように変更しました。

  where items = [ TaggedItem "tag,tag1,tag2"
                , TaggedItem "tag,tag3,tag4"
                , TaggedItem "tag,tag5,tag6" ]

そして今、それも機能します。

于 2013-01-20T08:16:07.470 に答える