@@ -3,11 +3,13 @@ use super::builder::{
33 TableSchema ,
44} ;
55use itertools:: Itertools as _;
6+ use opentelemetry_proto:: tonic:: trace:: v1:: status:: StatusCode as PBStatusCode ;
67use traceql:: {
78 ComparisonOperator , Expression , FieldExpr , FieldType , FieldValue ,
8- IntrisincField , LogicalOperator , SpanSet ,
9+ IntrisincField , LogicalOperator , SpanSet , StatusCode ,
910} ;
1011
12+ #[ allow( dead_code) ]
1113enum SubQuery < T : TableSchema , C : QueryConverter > {
1214 Basic ( QueryPlan < T , C > ) ,
1315 And ( Box < SubQuery < T , C > > , Box < SubQuery < T , C > > ) ,
3133 {
3234 match expr {
3335 Expression :: SpanSet ( spanset) => {
34- let selection = spanset_to_qp ( spanset) ;
36+ let selection = spanset_to_selection ( spanset) ;
3537 let mut qp = QueryPlan :: new (
3638 converter. clone ( ) ,
3739 schema. clone ( ) ,
@@ -49,26 +51,19 @@ where
4951 qp. projection = vec ! [ schema. trace_key( ) . to_string( ) ] ;
5052 SubQuery :: Basic ( qp)
5153 }
52- Expression :: Logical ( left, op, right) => {
53- let l =
54- Self :: new ( converter. clone ( ) , left, schema. clone ( ) , spans) ;
55- let r =
56- Self :: new ( converter. clone ( ) , right, schema. clone ( ) , spans) ;
57- match op {
58- LogicalOperator :: And => {
59- SubQuery :: And ( Box :: new ( l) , Box :: new ( r) )
60- }
61- LogicalOperator :: Or => {
62- SubQuery :: Or ( Box :: new ( l) , Box :: new ( r) )
63- }
64- }
54+ Expression :: Logical ( _, _, _) => {
55+ unimplemented ! ( "logical expression" )
6556 }
6657 }
6758 }
6859 fn as_sql ( & self ) -> String {
6960 match self {
7061 SubQuery :: Basic ( qp) => {
71- format ! ( "sub.{} IN ({})" , qp. schema. trace_key( ) , qp. as_sql( ) )
62+ format ! (
63+ "sub.{} GLOBAL IN ({})" ,
64+ qp. schema. trace_key( ) ,
65+ qp. as_sql( )
66+ )
7267 }
7368 SubQuery :: And ( l, r) => {
7469 let l_sql = l. as_sql ( ) ;
8479 }
8580}
8681
87- fn spanset_to_qp ( spanset : & SpanSet ) -> Selection {
82+ fn spanset_to_selection ( spanset : & SpanSet ) -> Selection {
8883 match spanset {
8984 SpanSet :: Expr ( expr) => {
9085 // expand unscoped into (resource or span)
@@ -98,16 +93,16 @@ fn spanset_to_qp(spanset: &SpanSet) -> Selection {
9893 operator : expr. operator ,
9994 } ) ;
10095 return Selection :: LogicalOr (
101- Box :: new ( spanset_to_qp ( & left) ) ,
102- Box :: new ( spanset_to_qp ( & right) ) ,
96+ Box :: new ( spanset_to_selection ( & left) ) ,
97+ Box :: new ( spanset_to_selection ( & right) ) ,
10398 ) ;
10499 }
105100 let c = field_expr_to_condition ( expr) ;
106101 Selection :: Unit ( c)
107102 }
108103 SpanSet :: Logical ( left, op, right) => {
109- let l = spanset_to_qp ( left) ;
110- let r = spanset_to_qp ( right) ;
104+ let l = spanset_to_selection ( left) ;
105+ let r = spanset_to_selection ( right) ;
111106 match op {
112107 LogicalOperator :: And => {
113108 Selection :: LogicalAnd ( Box :: new ( l) , Box :: new ( r) )
@@ -167,12 +162,22 @@ fn construct_condition(
167162 }
168163}
169164
165+ fn convert_status_code ( s : StatusCode ) -> PBStatusCode {
166+ match s {
167+ StatusCode :: Err => PBStatusCode :: Error ,
168+ StatusCode :: Ok => PBStatusCode :: Ok ,
169+ StatusCode :: Unset => PBStatusCode :: Unset ,
170+ }
171+ }
172+
170173fn field_expr_to_condition ( expr : & FieldExpr ) -> Condition {
171174 match & expr. kv {
172175 FieldType :: Intrinsic ( intrisinc) => match intrisinc {
173176 IntrisincField :: Status ( status) => construct_condition (
174177 Column :: Raw ( "StatusCode" . to_string ( ) ) ,
175- PlaceValue :: Integer ( ( * status) . into ( ) ) ,
178+ PlaceValue :: String (
179+ convert_status_code ( * status) . as_str_name ( ) . to_string ( ) ,
180+ ) ,
176181 expr. operator ,
177182 ) ,
178183 IntrisincField :: Duraion ( d) => construct_condition (
@@ -253,7 +258,7 @@ where
253258 }
254259 pub fn as_sql ( & self ) -> String {
255260 let mut sql = format ! (
256- "SELECT * FROM {} sp WHERE sp.{} IN (SELECT {} FROM (" ,
261+ "SELECT * FROM {} sp WHERE sp.{} GLOBAL IN (SELECT {} FROM (" ,
257262 self . schema. table( ) ,
258263 self . schema. span_id_key( ) ,
259264 self . schema. span_id_key( ) ,
@@ -270,3 +275,27 @@ where
270275 sql
271276 }
272277}
278+
279+ pub fn single_spanset_query < T , C > (
280+ spanset : & SpanSet ,
281+ schema : T ,
282+ projection : Vec < String > ,
283+ converter : C ,
284+ ) -> String
285+ where
286+ T : TableSchema ,
287+ C : QueryConverter ,
288+ {
289+ let selection = spanset_to_selection ( spanset) ;
290+ QueryPlan :: new (
291+ converter,
292+ schema,
293+ projection,
294+ Some ( selection) ,
295+ vec ! [ ] ,
296+ vec ! [ ] ,
297+ vec ! [ ] ,
298+ Some ( 500 ) ,
299+ )
300+ . as_sql ( )
301+ }
0 commit comments