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('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(["(STRING_AGG(CAST(players.name AS TEXT), '') ILIKE ? AND NOT STRING_AGG(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(["((STRING_AGG(CAST(players.name AS TEXT), '') ILIKE ? AND STRING_AGG(CAST(players.name AS TEXT), '') ILIKE ?) OR STRING_AGG(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(["(STRING_AGG(CAST(players.name AS TEXT), '') ILIKE ? AND (STRING_AGG(CAST(players.name AS TEXT), '') ILIKE ? OR STRING_AGG(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(["(STRING_AGG(CAST(players.name AS TEXT), '') ILIKE ? AND NOT (STRING_AGG(CAST(players.name AS TEXT), '') ILIKE ? OR STRING_AGG(CAST(players.name AS TEXT), '') ILIKE ?))",'%a%','%b%','%c%'])}
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(["((STRING_AGG(CAST(players.device_id AS TEXT), '') ILIKE ? OR (STRING_AGG(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%'])}
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 STRING_AGG(CAST(players.device_id AS TEXT), '') ILIKE ?) OR ((CAST(players.name AS TEXT) ILIKE ? OR CAST(players.tags AS TEXT) ILIKE ?) AND NOT STRING_AGG(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%'])}