it{expect(described_class.new('some-default-value',[:"players.name"],:"players.name").where_clause).toeq(['(CAST(players.name AS TEXT) ILIKE ?)','%some-default-value%'])}
# tests simple search with two default columns without quotes
it{expect(described_class.new('search-term',[:'players.name',:'players.tags','players.id'],[:'players.name',:'players.tags']).where_clause).toeq(['(CAST(players.name AS TEXT) ILIKE ? OR CAST(players.tags AS TEXT) ILIKE ?)','%search-term%','%search-term%'])}
# tests simple search with two default columns with quotes
it{expect(described_class.new('"search-term"',[:'players.name',:'players.tags','players.id'],[:'players.name',:'players.tags']).where_clause).toeq(['(CAST(players.name AS TEXT) ILIKE ? OR CAST(players.tags AS TEXT) ILIKE ?)','%search-term%','%search-term%'])}
# tests simple search with three default columns without quotes
it{expect(described_class.new('search-term',[:'players.name',:'players.tags','players.id'],[:'players.name',:'players.tags',:'players.id']).where_clause).toeq(['(CAST(players.name AS TEXT) ILIKE ? OR CAST(players.tags AS TEXT) ILIKE ? OR CAST(players.id AS TEXT) ILIKE ?)','%search-term%','%search-term%','%search-term%'])}
it{expect(described_class.new('"ab"',[:"players.name",:"players.device_id"],:"players.device_id").where_clause).toeq(["(CAST(players.device_id AS TEXT) ILIKE ?)","%ab%"])}
it{expect(described_class.new('tags:"ab"',[:"players.name",:"players.tags"],:"players.device_id").where_clause).toeq(["CAST(players.tags AS TEXT) ILIKE ?","%ab%"])}
it{expect(described_class.new('123 456',[:"players.name",:"players.device_id"],:"players.device_id").where_clause).toeq(["((CAST(players.device_id AS TEXT) ILIKE ?) OR (CAST(players.device_id AS TEXT) ILIKE ?))","%123%","%456%"])}
it{expect(described_class.new('123 or 456',[:"players.name",:"players.device_id"],:"players.device_id").where_clause).toeq(["((CAST(players.device_id AS TEXT) ILIKE ?) OR (CAST(players.device_id AS TEXT) ILIKE ?))","%123%","%456%"])}
it{expect(described_class.new('123 and 456',[:"players.name",:"players.device_id"],:"players.device_id").where_clause).toeq(["((CAST(players.device_id AS TEXT) ILIKE ?) AND (CAST(players.device_id AS TEXT) ILIKE ?))","%123%","%456%"])}
it{expect(described_class.new('name:ab and not value:hf-1',[:"players.name",:"players.value"],:"players.device_id").where_clause).toeq(['(CAST(players.name AS TEXT) ILIKE ? AND NOT CAST(players.value AS TEXT) ILIKE ?)','%ab%','%hf-1%'])}
it{expect(described_class.new('name:a and name:b or name:c',[:"players.name",:"players.value"],:"players.device_id").where_clause).toeq(['((CAST(players.name AS TEXT) ILIKE ? AND CAST(players.name AS TEXT) ILIKE ?) OR CAST(players.name AS TEXT) ILIKE ?)','%a%','%b%','%c%'])}
it{expect(described_class.new('name:a and (name:b or name:c)',[:"players.name",:"players.value"],:"players.device_id").where_clause).toeq(['(CAST(players.name AS TEXT) ILIKE ? AND (CAST(players.name AS TEXT) ILIKE ? OR CAST(players.name AS TEXT) ILIKE ?))','%a%','%b%','%c%'])}
it{expect(described_class.new('name:a and not (name:b or name:c)',[:"players.name",:"players.value"],:"players.device_id").where_clause).toeq(['(CAST(players.name AS TEXT) ILIKE ? AND NOT (CAST(players.name AS TEXT) ILIKE ? OR CAST(players.name AS TEXT) ILIKE ?))','%a%','%b%','%c%'])}
it{expect(described_class.new('name:"%a_\"',[:"players.name",:"players.value"],:"players.device_id").where_clause).toeq(['CAST(players.name AS TEXT) ILIKE ?','%\%a\_\\%'])}
it{expect(described_class.new('tags:h1-r',[:'players.name',:'players.value',:'players.device_id'],:"players.device_id",{tags:"tags.value"}).where_clause).toeq(['CAST(tags.value AS TEXT) ILIKE ?','%h1-r%'])}
it{expect(described_class.new('tags:h1-r',[:'players.name',:'players.tags',:'players.device_id'],:"players.device_id",{tags:"tags.value"}).where_clause).toeq(["CAST(tags.value AS TEXT) ILIKE ?","%h1-r%"])}
it{expect(described_class.new('(device_id:"with space" tags:mta no-quotes-id-123) or "id with quotes-5" and ( ("id with q 10" or "id with q 20") and ("id with Q 30" "id with Q 40") and not id-without-Q-50)',[:'players.name',:'players.value',:'players.device_id'],:"players.device_id",{tags:'tags.name'}).where_clause).toeq(['((CAST(players.device_id AS TEXT) ILIKE ? OR (CAST(tags.name AS TEXT) ILIKE ? OR (CAST(players.device_id AS TEXT) ILIKE ?))) OR ((CAST(players.device_id AS TEXT) ILIKE ?) AND ((((CAST(players.device_id AS TEXT) ILIKE ?) OR (CAST(players.device_id AS TEXT) ILIKE ?)) AND ((CAST(players.device_id AS TEXT) ILIKE ?) OR (CAST(players.device_id AS TEXT) ILIKE ?))) AND NOT (CAST(players.device_id AS TEXT) ILIKE ?))))','%with space%','%mta%','%no-quotes-id-123%','%id with quotes-5%','%id with q 10%','%id with q 20%','%id with Q 30%','%id with Q 40%','%id-without-Q-50%'])}
# tests mixed query with and without column names and with multiple default columns
it{expect(described_class.new('("green hunter" and device_id:100) or ("blue bird" and not device_id:200)',[:'players.name',:'players.value',:'players.device_id'],[:"players.name",:"players.tags"]).where_clause).toeq(['(((CAST(players.name AS TEXT) ILIKE ? OR CAST(players.tags AS TEXT) ILIKE ?) AND CAST(players.device_id AS TEXT) ILIKE ?) OR ((CAST(players.name AS TEXT) ILIKE ? OR CAST(players.tags AS TEXT) ILIKE ?) AND NOT CAST(players.device_id AS TEXT) ILIKE ?))','%green hunter%','%green hunter%','%100%','%blue bird%','%blue bird%','%200%'])}
it{expect(described_class.new('123-and-456 -or-2 -not_not_1',[:'players.title',:'players.tag',:'players.device_id'],:'players.device_id').where_clause).toeq(['((CAST(players.device_id AS TEXT) ILIKE ?) OR ((CAST(players.device_id AS TEXT) ILIKE ?) OR (CAST(players.device_id AS TEXT) ILIKE ?)))','%123-and-456%','%-or-2%','%-not\_not\_1%'])}
it{expect(described_class.new('andrew or ornela',[:'players.title',:'players.tag',:'players.device_id'],:'players.device_id').where_clause).toeq(['((CAST(players.device_id AS TEXT) ILIKE ?) OR (CAST(players.device_id AS TEXT) ILIKE ?))','%andrew%','%ornela%'])}