@@ -37,15 +37,24 @@ def to_sqlmesh(dbt_select: t.Collection[str], dbt_exclude: t.Collection[str]) ->
3737 -> "+main.model_a & ^(raw.src_data)"
3838 --select "+main.model_a" --select "main.*b+" --exclude "raw.src_data"
3939 -> "(+main.model_a | main.*b+) & ^(raw.src_data)"
40+ --select "+main.model_a" --select "main.*b+" --exclude "raw.src_data" --exclude "main.model_c"
41+ -> "(+main.model_a | main.*b+) & ^(raw.src_data | main.model_c)"
42+ --select "+main.model_a main.*b+" --exclude "raw.src_data main.model_c"
43+ -> "(+main.model_a | main.*b+) & ^(raw.src_data | main.model_c)"
4044 """
4145 if not dbt_select and not dbt_exclude :
4246 return None
4347
4448 select_expr = " | " .join (_to_sqlmesh (expr ) for expr in dbt_select )
4549 select_expr = _wrap (select_expr ) if dbt_exclude and len (dbt_select ) > 1 else select_expr
4650
47- exclude_expr = " | " .join (_to_sqlmesh (expr , negate = True ) for expr in dbt_exclude )
48- exclude_expr = _wrap (exclude_expr ) if dbt_select and len (dbt_exclude ) > 1 else exclude_expr
51+ exclude_expr = ""
52+
53+ if dbt_exclude :
54+ exclude_expr = " | " .join (_to_sqlmesh (expr ) for expr in dbt_exclude )
55+ exclude_expr = _negate (
56+ _wrap (exclude_expr ) if dbt_select and len (dbt_exclude ) > 1 else exclude_expr
57+ )
4958
5059 main_expr = " & " .join ([expr for expr in [select_expr , exclude_expr ] if expr ])
5160
@@ -56,13 +65,9 @@ def to_sqlmesh(dbt_select: t.Collection[str], dbt_exclude: t.Collection[str]) ->
5665 return main_expr
5766
5867
59- def _to_sqlmesh (selector_str : str , negate : bool = False ) -> str :
68+ def _to_sqlmesh (selector_str : str ) -> str :
6069 unions , intersections = _split_unions_and_intersections (selector_str )
6170
62- if negate :
63- unions = [_negate (u ) for u in unions ]
64- intersections = [_negate (i ) for i in intersections ]
65-
6671 union_expr = " | " .join (unions )
6772 intersection_expr = " & " .join (intersections )
6873
@@ -79,6 +84,7 @@ def _split_unions_and_intersections(selector_str: str) -> t.Tuple[t.List[str], t
7984 # break space-separated items like: "my_first_model my_second_model" into a list of selectors to union
8085 # and comma-separated items like: "my_first_model,my_second_model" into a list of selectors to intersect
8186 # but, take into account brackets, eg "(my_first_model & my_second_model)" should not be split
87+ # also take into account both types in the same string, eg "my_first_model my_second_model model_3,model_4,model_5"
8288
8389 def _split_by (input : str , delimiter : str ) -> t .Iterator [str ]:
8490 buf = ""
0 commit comments