Generowanie wyrażenia wyszukiwania w serwisie Allegro.pl

0

Witam,

Borykam się z problemem stworzenia eleganckiej klasy generującej na podstawie obranych kryteriów (jedynie łączniki AND, OR i NOT) wyrażenia wyszukiwania w serwisie Allegro.pl. Wyrażenia te nie są skomplikowane ale chciałbym ten proces zautomatyzować i zaprojektować obiektowo. Dla przykładu wyrażenie:

"gra (nowa pl) (diablo baldurs warcraft) -uzywana"

co logicznie odpowiada zapisowi:

"gra AND (nowa OR pl) AND (diablo OR baldurs OR warcraft) NOT uzywana"

Próbuję stworzyć klasę Criteria (generującą gotowe wyrażenie na podstawie kryteriów) i odpowiednie operatory logiczne OrCriterion, AndCriterion, NotCriterion.

Udało mi się stworzyć taką funkcjonalność:

          SearchExpressionCriteria target = new SearchExpressionCriteria();
            target
                .Add(Expression.And("gra"))
                .Add(Expression.Or("nowa"))
                .Add(Expression.Or("pl"))
                .Add(Expression.Or("diablo"))
                .Add(Expression.Or("baldurs"))
                .Add(Expression.Or("warcraft"))
                .Add(Expression.Not("uzywana"));

Ale nie działa to właściwie bo z OR-ów generuje mi jeden nawias:

"gra (nowa pl diablo baldurs warcraft) -uzywana"

i nie wiem jak to zgrabnie zrealizować (również składniowo) by móc łączyć alternatywy w zbiory.

Czy ktoś z was ma pomysł jak to zgrabnie zrealizować?

0

Problem udało mi się rozwiązać otrzymując dość wygodną składnię:

        [TestMethod()]
        public void ToStringFirstTest()
        {
            SearchExpressionCriteria target = new SearchExpressionCriteria();
            target
                .Add(Expression.And("gra", Expression.Or("nowa", "pl")))
                .Add(Expression.And(Expression.Or("diablo", "baldurs", "warcraft")))
                .Add(Expression.Not("uzywana"));
                        
            string expected = "gra (nowa pl) (diablo baldurs warcraft) -uzywana";
            string actual;

            actual = target.ToString();
            Assert.AreEqual(expected, actual);
        }

Zatem problem rozwiązany.

Pozdrawiam
Marcin

0

Innymi slowy potrzebujesz budowac drzewo wyrazen, jak w drugim przykladzie. W pierwszym ograniczales sie do plaskiej struktury, nie uwzgledniajacej zagniezdzen.

0

A najbardziej w tym wszystkim martwi mnie to, że mięło 20 minut zanim zrozumiałem ten fakt :-).

Pozdrawiam
Marcin

1 użytkowników online, w tym zalogowanych: 0, gości: 1