1use crate::conversion::{FromGValue, ToGValue};
2use crate::process::traversal::strategies::{
3 RemoteStrategy, TraversalStrategies, TraversalStrategy,
4};
5
6#[cfg(feature = "async_gremlin")]
7use crate::aio::process::traversal::remote::AsyncTerminator;
8#[cfg(feature = "async_gremlin")]
9use crate::aio::GremlinClient as GremlinAsyncClient;
10use crate::process::traversal::remote::{MockTerminator, SyncTerminator, Terminator};
11use crate::process::traversal::Bytecode;
12use crate::process::traversal::{GraphTraversal, TraversalBuilder};
13use crate::structure::GIDs;
14use crate::structure::Labels;
15use crate::structure::{Edge, GValue, Vertex};
16use crate::GremlinClient;
17
18#[derive(Clone)]
19pub struct GraphTraversalSource<A: Terminator<GValue>> {
20 term: A,
21}
22
23impl<A: Terminator<GValue>> GraphTraversalSource<A> {
24 pub fn new(terminator: A) -> GraphTraversalSource<A> {
25 GraphTraversalSource { term: terminator }
26 }
27
28 pub fn empty() -> GraphTraversalSource<MockTerminator> {
29 GraphTraversalSource::new(MockTerminator {})
30 }
31
32 pub fn with_remote(&self, client: GremlinClient) -> GraphTraversalSource<SyncTerminator> {
33 let mut strategies = TraversalStrategies::new(vec![]);
34
35 strategies.add_strategy(TraversalStrategy::Remote(RemoteStrategy::new(client)));
36
37 GraphTraversalSource {
38 term: SyncTerminator::new(strategies),
39 }
40 }
41
42 #[cfg(feature = "async_gremlin")]
43 pub fn with_remote_async(
44 &self,
45 client: GremlinAsyncClient,
46 ) -> GraphTraversalSource<AsyncTerminator> {
47 GraphTraversalSource {
48 term: AsyncTerminator::new(client),
49 }
50 }
51
52 pub fn v<T>(&self, ids: T) -> GraphTraversal<Vertex, Vertex, A>
53 where
54 T: Into<GIDs>,
55 A: Terminator<Vertex>,
56 {
57 let mut code = Bytecode::new();
58
59 code.add_step(
60 String::from("V"),
61 ids.into().0.iter().map(|id| id.to_gvalue()).collect(),
62 );
63
64 GraphTraversal::new(self.term.clone(), TraversalBuilder::new(code))
65 }
66
67 pub fn add_v<T>(&self, label: T) -> GraphTraversal<Vertex, Vertex, A>
68 where
69 T: Into<Labels>,
70 A: Terminator<Vertex>,
71 {
72 let mut code = Bytecode::new();
73
74 code.add_step(
75 String::from("addV"),
76 label.into().0.into_iter().map(GValue::from).collect(),
77 );
78
79 GraphTraversal::new(self.term.clone(), TraversalBuilder::new(code))
80 }
81
82 pub fn add_e<T>(&self, label: T) -> GraphTraversal<Edge, Edge, A>
83 where
84 T: Into<Labels>,
85 A: Terminator<Edge>,
86 {
87 let mut code = Bytecode::new();
88
89 code.add_step(
90 String::from("addE"),
91 label.into().0.into_iter().map(GValue::from).collect(),
92 );
93
94 GraphTraversal::new(self.term.clone(), TraversalBuilder::new(code))
95 }
96
97 pub fn e<T>(&self, ids: T) -> GraphTraversal<Edge, Edge, A>
98 where
99 T: Into<GIDs>,
100 A: Terminator<Edge>,
101 {
102 let mut code = Bytecode::new();
103
104 code.add_step(
105 String::from("E"),
106 ids.into().0.iter().map(|id| id.to_gvalue()).collect(),
107 );
108
109 GraphTraversal::new(self.term.clone(), TraversalBuilder::new(code))
110 }
111
112 pub fn with_side_effect<T>(&self, step: (&'static str, T)) -> GraphTraversal<GValue, GValue, A>
113 where
114 T: Into<GValue> + FromGValue,
115 A: Terminator<T>,
116 {
117 let mut code = Bytecode::new();
118
119 code.add_source(
120 String::from("withSideEffect"),
121 vec![step.0.into(), step.1.into()],
122 );
123 GraphTraversal::new(self.term.clone(), TraversalBuilder::new(code))
124 }
125}
126
127#[cfg(test)]
129mod tests {
130
131 use crate::process::traversal::remote::MockTerminator;
132
133 use super::GraphTraversalSource;
134 use crate::process::traversal::{Bytecode, Order, Scope, __};
135 use crate::structure::{GValue, P, T};
136
137 fn empty() -> GraphTraversalSource<MockTerminator> {
138 GraphTraversalSource::new(MockTerminator {})
139 }
140
141 #[test]
142 fn v_traversal() {
143 let g = empty();
144
145 let mut code = Bytecode::new();
146
147 code.add_step(String::from("V"), vec![1.into()]);
148
149 assert_eq!(&code, g.v(1).bytecode());
150 }
151
152 #[test]
153 fn e_traversal() {
154 let g = empty();
155
156 let mut code = Bytecode::new();
157
158 code.add_step(String::from("E"), vec![1.into()]);
159
160 assert_eq!(&code, g.e(1).bytecode());
161 }
162 #[test]
163 fn v_has_label_traversal() {
164 let g = empty();
165
166 let mut code = Bytecode::new();
167
168 code.add_step(String::from("V"), vec![1.into()]);
169 code.add_step(
170 String::from("hasLabel"),
171 vec![String::from("person").into()],
172 );
173
174 assert_eq!(&code, g.v(1).has_label("person").bytecode());
175 }
176
177 #[test]
178 fn v_has_traversal() {
179 let g = empty();
180
181 let mut code = Bytecode::new();
182
183 code.add_step(String::from("V"), vec![1.into()]);
184 code.add_step(
185 String::from("has"),
186 vec![
187 String::from("name").into(),
188 P::new("eq", String::from("marko").into()).into(),
189 ],
190 );
191 code.add_step(
192 String::from("has"),
193 vec![String::from("age").into(), P::new("eq", 23.into()).into()],
194 );
195
196 assert_eq!(
197 &code,
198 g.v(1).has(("name", "marko")).has(("age", 23)).bytecode()
199 );
200
201 let mut code = Bytecode::new();
204
205 code.add_step(String::from("V"), vec![]);
206 code.add_step(
207 String::from("has"),
208 vec![
209 String::from("person").into(),
210 String::from("name").into(),
211 P::new("eq", String::from("marko").into()).into(),
212 ],
213 );
214
215 assert_eq!(&code, g.v(()).has(("person", "name", "marko")).bytecode());
216
217 let mut code = Bytecode::new();
220
221 code.add_step(String::from("V"), vec![]);
222 code.add_step(String::from("has"), vec![String::from("name").into()]);
223
224 assert_eq!(&code, g.v(()).has("name").bytecode());
225
226 let mut code = Bytecode::new();
229
230 code.add_step(String::from("V"), vec![]);
231 code.add_step(String::from("hasNot"), vec![String::from("name").into()]);
232
233 assert_eq!(&code, g.v(()).has_not("name").bytecode());
234 }
235
236 #[test]
237 fn v_has_traversal_with_p() {
238 let g = empty();
239
240 let mut code = Bytecode::new();
242
243 code.add_step(String::from("V"), vec![1.into()]);
244
245 code.add_step(
246 String::from("has"),
247 vec![String::from("age").into(), P::eq(23).into()],
248 );
249 assert_eq!(&code, g.v(1).has(("age", P::eq(23))).bytecode());
250
251 let mut code = Bytecode::new();
253
254 code.add_step(String::from("V"), vec![1.into()]);
255
256 code.add_step(
257 String::from("has"),
258 vec![String::from("age").into(), P::neq(23).into()],
259 );
260 assert_eq!(&code, g.v(1).has(("age", P::neq(23))).bytecode());
261
262 let mut code = Bytecode::new();
264
265 code.add_step(String::from("V"), vec![1.into()]);
266
267 code.add_step(
268 String::from("has"),
269 vec![String::from("age").into(), P::gte(23).into()],
270 );
271
272 assert_eq!(&code, g.v(1).has(("age", P::gte(23))).bytecode());
273
274 let mut code = Bytecode::new();
276
277 code.add_step(String::from("V"), vec![1.into()]);
278
279 code.add_step(
280 String::from("has"),
281 vec![String::from("age").into(), P::gt(23).into()],
282 );
283
284 assert_eq!(&code, g.v(1).has(("age", P::gt(23))).bytecode());
285
286 let mut code = Bytecode::new();
288
289 code.add_step(String::from("V"), vec![1.into()]);
290
291 code.add_step(
292 String::from("has"),
293 vec![String::from("age").into(), P::lte(23).into()],
294 );
295 assert_eq!(&code, g.v(1).has(("age", P::lte(23))).bytecode());
296
297 let mut code = Bytecode::new();
299
300 code.add_step(String::from("V"), vec![1.into()]);
301
302 code.add_step(
303 String::from("has"),
304 vec![String::from("age").into(), P::lt(23).into()],
305 );
306 assert_eq!(&code, g.v(1).has(("age", P::lt(23))).bytecode());
307
308 let mut code = Bytecode::new();
310
311 code.add_step(String::from("V"), vec![1.into()]);
312
313 code.add_step(
314 String::from("has"),
315 vec![String::from("age").into(), P::within((23, 26)).into()],
316 );
317 assert_eq!(&code, g.v(1).has(("age", P::within((23, 26)))).bytecode());
318
319 let mut code = Bytecode::new();
321
322 code.add_step(String::from("V"), vec![1.into()]);
323 code.add_step(String::from("values"), vec!["age".into()]);
324 code.add_step(String::from("is"), vec![P::eq(23).into()]);
325
326 assert_eq!(&code, g.v(1).values("age").is(23).bytecode());
327 }
328 #[test]
329 fn add_v_test() {
330 let g = empty();
331
332 let mut code = Bytecode::new();
333
334 code.add_step(String::from("addV"), vec![String::from("person").into()]);
335
336 assert_eq!(&code, g.add_v("person").bytecode());
337
338 let mut code = Bytecode::new();
339
340 code.add_step(String::from("addV"), vec![]);
341
342 assert_eq!(&code, g.add_v(()).bytecode());
343 }
344
345 #[test]
346 fn add_v_with_property_test() {
347 let g = empty();
348
349 let mut code = Bytecode::new();
350
351 code.add_step(String::from("addV"), vec![String::from("person").into()]);
352 code.add_step(
353 String::from("property"),
354 vec![String::from("name").into(), String::from("marko").into()],
355 );
356
357 assert_eq!(
358 &code,
359 g.add_v("person").property("name", "marko").bytecode()
360 );
361 }
362
363 #[test]
364 fn add_e_test() {
365 let g = empty();
366
367 let mut code = Bytecode::new();
368
369 code.add_step(String::from("addE"), vec![String::from("knows").into()]);
370
371 assert_eq!(&code, g.add_e("knows").bytecode());
372
373 let mut code = Bytecode::new();
374
375 code.add_step(String::from("addE"), vec![String::from("knows").into()]);
376 code.add_step(String::from("from"), vec![String::from("a").into()]);
377 code.add_step(String::from("to"), vec![String::from("b").into()]);
378
379 assert_eq!(&code, g.add_e("knows").from("a").to("b").bytecode());
380 }
381
382 #[test]
383 fn add_e_test_with_traversal() {
384 let g = empty();
385
386 let mut code = Bytecode::new();
387
388 code.add_step(String::from("addE"), vec![String::from("knows").into()]);
389 code.add_step(
390 String::from("from"),
391 vec![__.v(1).bytecode().clone().into()],
392 );
393 code.add_step(String::from("to"), vec![__.v(2).bytecode().clone().into()]);
394
395 assert_eq!(&code, g.add_e("knows").from(__.v(1)).to(__.v(2)).bytecode());
396 }
397
398 #[test]
399 fn as_test() {
400 let g = empty();
401
402 let mut code = Bytecode::new();
403
404 code.add_step(String::from("V"), vec![]);
405 code.add_step(String::from("as"), vec![String::from("a").into()]);
406
407 assert_eq!(&code, g.v(()).as_("a").bytecode());
408 }
409
410 #[test]
411 fn label_step_test() {
412 let g = empty();
413
414 let mut code = Bytecode::new();
415
416 code.add_step(String::from("V"), vec![]);
417 code.add_step(String::from("label"), vec![]);
418
419 assert_eq!(&code, g.v(()).label().bytecode());
420 }
421
422 #[test]
423 fn properties_step_test() {
424 let g = empty();
425
426 let mut code = Bytecode::new();
427
428 code.add_step(String::from("V"), vec![]);
429 code.add_step(String::from("properties"), vec![]);
430
431 assert_eq!(&code, g.v(()).properties(()).bytecode());
432
433 let mut code = Bytecode::new();
434
435 code.add_step(String::from("V"), vec![]);
436 code.add_step(
437 String::from("properties"),
438 vec![String::from("name").into()],
439 );
440
441 assert_eq!(&code, g.v(()).properties("name").bytecode());
442
443 let mut code = Bytecode::new();
444
445 code.add_step(String::from("V"), vec![]);
446 code.add_step(
447 String::from("properties"),
448 vec![String::from("name").into(), String::from("surname").into()],
449 );
450
451 assert_eq!(
453 &code,
454 g.v(()).properties(vec!["name", "surname"]).bytecode()
455 );
456
457 assert_eq!(&code, g.v(()).properties(["name", "surname"]).bytecode());
459 }
460
461 #[test]
462 fn property_map_step_test() {
463 let g = empty();
464
465 let mut code = Bytecode::new();
466
467 code.add_step(String::from("V"), vec![]);
468 code.add_step(String::from("propertyMap"), vec![]);
469
470 assert_eq!(&code, g.v(()).property_map(()).bytecode());
471
472 let mut code = Bytecode::new();
473
474 code.add_step(String::from("V"), vec![]);
475 code.add_step(
476 String::from("propertyMap"),
477 vec![String::from("name").into()],
478 );
479
480 assert_eq!(&code, g.v(()).property_map("name").bytecode());
481
482 let mut code = Bytecode::new();
483
484 code.add_step(String::from("V"), vec![]);
485 code.add_step(
486 String::from("propertyMap"),
487 vec![String::from("name").into(), String::from("surname").into()],
488 );
489
490 assert_eq!(
492 &code,
493 g.v(()).property_map(vec!["name", "surname"]).bytecode()
494 );
495
496 assert_eq!(&code, g.v(()).property_map(["name", "surname"]).bytecode());
498 }
499
500 #[test]
501 fn values_step_test() {
502 let g = empty();
503
504 let mut code = Bytecode::new();
505
506 code.add_step(String::from("V"), vec![]);
507 code.add_step(String::from("values"), vec![]);
508
509 assert_eq!(&code, g.v(()).values(()).bytecode());
510
511 let mut code = Bytecode::new();
512
513 code.add_step(String::from("V"), vec![]);
514 code.add_step(String::from("values"), vec![String::from("name").into()]);
515
516 assert_eq!(&code, g.v(()).values("name").bytecode());
517
518 let mut code = Bytecode::new();
519
520 code.add_step(String::from("V"), vec![]);
521 code.add_step(
522 String::from("values"),
523 vec![String::from("name").into(), String::from("surname").into()],
524 );
525
526 assert_eq!(&code, g.v(()).values(vec!["name", "surname"]).bytecode());
528
529 assert_eq!(&code, g.v(()).values(["name", "surname"]).bytecode());
531 }
532
533 #[test]
534 fn value_map_step_test() {
535 let g = empty();
536
537 let mut code = Bytecode::new();
538
539 code.add_step(String::from("V"), vec![]);
540 code.add_step(String::from("valueMap"), vec![]);
541
542 assert_eq!(&code, g.v(()).value_map(()).bytecode());
543
544 let mut code = Bytecode::new();
545
546 code.add_step(String::from("V"), vec![]);
547 code.add_step(String::from("valueMap"), vec![String::from("name").into()]);
548
549 assert_eq!(&code, g.v(()).value_map("name").bytecode());
550
551 let mut code = Bytecode::new();
552
553 code.add_step(String::from("V"), vec![]);
554 code.add_step(
555 String::from("valueMap"),
556 vec![String::from("name").into(), String::from("surname").into()],
557 );
558
559 assert_eq!(&code, g.v(()).value_map(vec!["name", "surname"]).bytecode());
560
561 assert_eq!(&code, g.v(()).value_map(["name", "surname"]).bytecode());
562 }
563
564 #[test]
565 fn element_map_step_test() {
566 let g = empty();
567
568 let mut code = Bytecode::new();
569
570 code.add_step(String::from("V"), vec![]);
571 code.add_step(String::from("elementMap"), vec![]);
572
573 assert_eq!(&code, g.v(()).element_map(()).bytecode());
574
575 let mut code = Bytecode::new();
576
577 code.add_step(String::from("V"), vec![]);
578 code.add_step(
579 String::from("elementMap"),
580 vec![String::from("name").into()],
581 );
582
583 assert_eq!(&code, g.v(()).element_map("name").bytecode());
584
585 let mut code = Bytecode::new();
586
587 code.add_step(String::from("V"), vec![]);
588 code.add_step(
589 String::from("elementMap"),
590 vec![String::from("name").into(), String::from("surname").into()],
591 );
592
593 assert_eq!(
594 &code,
595 g.v(()).element_map(vec!["name", "surname"]).bytecode()
596 );
597
598 assert_eq!(&code, g.v(()).element_map(["name", "surname"]).bytecode());
599 }
600
601 #[test]
602 fn count_test() {
603 let g = empty();
604
605 let mut code = Bytecode::new();
606
607 code.add_step(String::from("V"), vec![]);
608 code.add_step(String::from("count"), vec![]);
609
610 assert_eq!(&code, g.v(()).count().bytecode());
611 }
612
613 #[test]
614 fn group_count_test() {
615 let g = empty();
616
617 let mut code = Bytecode::new();
618
619 code.add_step(String::from("V"), vec![]);
620 code.add_step(String::from("groupCount"), vec![]);
621
622 assert_eq!(&code, g.v(()).group_count().bytecode());
623
624 let mut code = Bytecode::new();
625
626 code.add_step(String::from("V"), vec![]);
627 code.add_step(String::from("groupCount"), vec!["m".into()]);
628
629 assert_eq!(&code, g.v(()).group_count_as("m").bytecode());
630 }
631
632 #[test]
633 fn group_count_by_test() {
634 let g = empty();
635
636 let mut code = Bytecode::new();
637
638 code.add_step(String::from("V"), vec![]);
639 code.add_step(String::from("groupCount"), vec![]);
640 code.add_step(String::from("by"), vec![]);
641
642 assert_eq!(&code, g.v(()).group_count().by(()).bytecode());
643
644 let mut code = Bytecode::new();
645
646 code.add_step(String::from("V"), vec![]);
647 code.add_step(String::from("groupCount"), vec![]);
648 code.add_step(String::from("by"), vec!["name".into()]);
649
650 assert_eq!(&code, g.v(()).group_count().by("name").bytecode());
651
652 let mut code = Bytecode::new();
653
654 code.add_step(String::from("V"), vec![]);
655 code.add_step(String::from("groupCount"), vec![]);
656 code.add_step(String::from("by"), vec![T::Label.into()]);
657
658 assert_eq!(&code, g.v(()).group_count().by(T::Label).bytecode());
659 }
660
661 #[test]
662 fn group_by_test() {
663 let g = empty();
664
665 let mut code = Bytecode::new();
666
667 code.add_step(String::from("V"), vec![]);
668 code.add_step(String::from("group"), vec![]);
669 code.add_step(String::from("by"), vec![]);
670
671 assert_eq!(&code, g.v(()).group().by(()).bytecode());
672
673 let mut code = Bytecode::new();
674
675 code.add_step(String::from("V"), vec![]);
676 code.add_step(String::from("group"), vec![]);
677 code.add_step(String::from("by"), vec!["name".into()]);
678
679 assert_eq!(&code, g.v(()).group().by("name").bytecode());
680
681 let mut code = Bytecode::new();
682
683 code.add_step(String::from("V"), vec![]);
684 code.add_step(String::from("group"), vec![]);
685 code.add_step(String::from("by"), vec![T::Label.into()]);
686
687 assert_eq!(&code, g.v(()).group().by(T::Label).bytecode());
688
689 let mut code = Bytecode::new();
690
691 code.add_step(String::from("V"), vec![]);
692 code.add_step(String::from("group"), vec![]);
693 code.add_step(String::from("by"), vec![T::Label.into()]);
694 code.add_step(
695 String::from("by"),
696 vec![__.count().bytecode().clone().into()],
697 );
698
699 assert_eq!(
700 &code,
701 g.v(()).group().by(T::Label).by(__.count()).bytecode()
702 );
703
704 let mut code = Bytecode::new();
705
706 code.add_step(String::from("V"), vec![]);
707 code.add_step(String::from("group"), vec!["m".into()]);
708 code.add_step(String::from("by"), vec![T::Label.into()]);
709
710 assert_eq!(&code, g.v(()).group_as("m").by(T::Label).bytecode());
711 }
712
713 #[test]
714 fn select_test() {
715 let g = empty();
716
717 let mut code = Bytecode::new();
718
719 code.add_step(String::from("V"), vec![]);
720 code.add_step(String::from("select"), vec!["name".into()]);
721
722 assert_eq!(&code, g.v(()).select("name").bytecode());
723
724 let mut code = Bytecode::new();
725
726 code.add_step(String::from("V"), vec![]);
727 code.add_step(
728 String::from("select"),
729 vec!["name".into(), "surname".into()],
730 );
731
732 assert_eq!(&code, g.v(()).select(vec!["name", "surname"]).bytecode());
733
734 assert_eq!(&code, g.v(()).select(["name", "surname"]).bytecode());
735 }
736
737 #[test]
738 fn fold_test() {
739 let g = empty();
740
741 let mut code = Bytecode::new();
742
743 code.add_step(String::from("V"), vec![]);
744 code.add_step(String::from("values"), vec!["name".into()]);
745 code.add_step(String::from("fold"), vec![]);
746
747 assert_eq!(&code, g.v(()).values("name").fold().bytecode());
748 }
749
750 #[test]
751 fn unfold_test() {
752 let g = empty();
753
754 let mut code = Bytecode::new();
755
756 code.add_step(String::from("V"), vec![]);
757 code.add_step(String::from("propertyMap"), vec![]);
758 code.add_step(String::from("unfold"), vec![]);
759
760 assert_eq!(&code, g.v(()).property_map(()).unfold().bytecode());
761 }
762
763 #[test]
764 fn path_test() {
765 let g = empty();
766
767 let mut code = Bytecode::new();
768
769 code.add_step(String::from("V"), vec![]);
770 code.add_step(String::from("path"), vec![]);
771
772 assert_eq!(&code, g.v(()).path().bytecode());
773 }
774
775 #[test]
776 fn limit_test() {
777 let g = empty();
778
779 let mut code = Bytecode::new();
780
781 code.add_step(String::from("V"), vec![]);
782 code.add_step(String::from("limit"), vec![GValue::Int64(1)]);
783
784 assert_eq!(&code, g.v(()).limit(1).bytecode());
785 }
786
787 #[test]
788 fn dedup_test() {
789 let g = empty();
790
791 let mut code = Bytecode::new();
792
793 code.add_step(String::from("V"), vec![]);
794 code.add_step(String::from("values"), vec![]);
795 code.add_step(String::from("dedup"), vec![]);
796
797 assert_eq!(&code, g.v(()).values(()).dedup(()).bytecode());
798 }
799
800 #[test]
801 fn numerical_test() {
802 let g = empty();
803
804 let mut code = Bytecode::new();
806
807 code.add_step(String::from("V"), vec![]);
808 code.add_step(String::from("values"), vec!["test".into()]);
809 code.add_step(String::from("sum"), vec![Scope::Global.into()]);
810
811 assert_eq!(&code, g.v(()).values("test").sum(()).bytecode());
812
813 let mut code = Bytecode::new();
815
816 code.add_step(String::from("V"), vec![]);
817 code.add_step(String::from("values"), vec!["test".into()]);
818 code.add_step(String::from("max"), vec![Scope::Global.into()]);
819
820 assert_eq!(&code, g.v(()).values("test").max(()).bytecode());
821
822 let mut code = Bytecode::new();
825
826 code.add_step(String::from("V"), vec![]);
827 code.add_step(String::from("values"), vec!["test".into()]);
828 code.add_step(String::from("mean"), vec![Scope::Global.into()]);
829
830 assert_eq!(&code, g.v(()).values("test").mean(()).bytecode());
831
832 let mut code = Bytecode::new();
835
836 code.add_step(String::from("V"), vec![]);
837 code.add_step(String::from("values"), vec!["test".into()]);
838 code.add_step(String::from("min"), vec![Scope::Global.into()]);
839
840 assert_eq!(&code, g.v(()).values("test").min(()).bytecode());
841 }
842
843 #[test]
844 fn where_test() {
845 let g = empty();
846
847 let mut code = Bytecode::new();
849
850 code.add_step(String::from("V"), vec![]);
851 code.add_step(String::from("values"), vec!["age".into()]);
852 code.add_step(String::from("where"), vec![P::eq(23).into()]);
853
854 assert_eq!(&code, g.v(()).values("age").where_(P::eq(23)).bytecode());
855 }
856
857 #[test]
858 fn not_test() {
859 let g = empty();
860
861 let mut code = Bytecode::new();
863
864 code.add_step(String::from("V"), vec![]);
865 code.add_step(
866 String::from("not"),
867 vec![__.has_label("person").bytecode().clone().into()],
868 );
869
870 assert_eq!(&code, g.v(()).not(__.has_label("person")).bytecode());
871 }
872
873 #[test]
874 fn order_test() {
875 let g = empty();
876
877 let mut code = Bytecode::new();
878
879 code.add_step(String::from("V"), vec![]);
880 code.add_step(String::from("values"), vec!["name".into()]);
881 code.add_step(String::from("order"), vec![Scope::Global.into()]);
882
883 assert_eq!(&code, g.v(()).values("name").order(()).bytecode());
884
885 let mut code = Bytecode::new();
886
887 code.add_step(String::from("V"), vec![]);
888 code.add_step(String::from("values"), vec!["name".into()]);
889 code.add_step(String::from("order"), vec![Scope::Global.into()]);
890 code.add_step(String::from("by"), vec![Order::Desc.into()]);
891
892 assert_eq!(
893 &code,
894 g.v(()).values("name").order(()).by(Order::Desc).bytecode()
895 );
896 }
897
898 #[test]
899 fn match_test() {
900 let g = empty();
901
902 let mut code = Bytecode::new();
903
904 code.add_step(String::from("V"), vec![]);
905 code.add_step(
906 String::from("match"),
907 vec![
908 __.as_("a").out(()).as_("b").bytecode().clone().into(),
909 __.as_("b").out(()).as_("c").bytecode().clone().into(),
910 ],
911 );
912 code.add_step(String::from("select"), vec!["a".into(), "c".into()]);
913
914 assert_eq!(
916 &code,
917 g.v(())
918 .match_(vec![
919 __.as_("a").out(()).as_("b"),
920 __.as_("b").out(()).as_("c")
921 ])
922 .select(vec!["a", "c"])
923 .bytecode()
924 );
925
926 assert_eq!(
928 &code,
929 g.v(())
930 .match_([__.as_("a").out(()).as_("b"), __.as_("b").out(()).as_("c")])
931 .select(["a", "c"])
932 .bytecode()
933 );
934 }
935
936 #[test]
937 fn drop_test() {
938 let g = empty();
939
940 let mut code = Bytecode::new();
941
942 code.add_step(String::from("V"), vec![]);
943 code.add_step(String::from("drop"), vec![]);
944
945 assert_eq!(&code, g.v(()).drop().bytecode());
946 }
947
948 #[test]
949 fn or_test() {
950 let g = empty();
951
952 let mut code = Bytecode::new();
953
954 code.add_step(String::from("V"), vec![]);
955 code.add_step(String::from("or"), vec![]);
956
957 assert_eq!(&code, g.v(()).or(()).bytecode());
958 }
959
960 #[test]
961 fn coalesce_test() {
962 let g = empty();
963
964 let mut code = Bytecode::new();
965
966 code.add_step(String::from("V"), vec![]);
967 code.add_step(String::from("hasLabel"), vec!["Person".into()]);
968 code.add_step(
969 String::from("coalesce"),
970 vec![
971 __.values("nickname").bytecode().clone().into(),
972 __.values("name").bytecode().clone().into(),
973 ],
974 );
975
976 assert_eq!(
977 &code,
978 g.v(())
979 .has_label("Person")
980 .coalesce::<GValue, _>([__.values("nickname"), __.values("name")])
981 .bytecode()
982 );
983 }
984
985 }