1   package eu.fbk.rdfpro;
2   
3   import java.util.ArrayList;
4   import java.util.Arrays;
5   import java.util.List;
6   import java.util.concurrent.atomic.AtomicInteger;
7   
8   import org.openrdf.model.Resource;
9   import org.openrdf.model.Statement;
10  import org.openrdf.model.URI;
11  import org.openrdf.model.Value;
12  import org.openrdf.model.impl.ContextStatementImpl;
13  import org.openrdf.model.vocabulary.OWL;
14  
15  import eu.fbk.rdfpro.RDFHandlers;
16  import eu.fbk.rdfpro.RDFProcessor;
17  import eu.fbk.rdfpro.RDFProcessors;
18  import eu.fbk.rdfpro.RDFSource;
19  import eu.fbk.rdfpro.RDFSources;
20  
21  public class RuleProcessorTest {
22  
23      // args: filename_dynamic_data_file + @rules_parameters
24      // example: data.tql.gz -r rdfs tbox.tql.gz
25  
26      public static void main(final String... args) throws Throwable {
27          mainRules(args);
28          // mainTemplate(args);
29      }
30  
31      private static void mainRules(final String... args) throws Throwable {
32  
33          int index = 0;
34          for (; index < args.length; ++index) {
35              if (args[index].equals("--")) {
36                  break;
37              }
38          }
39  
40          final RDFSource source = RDFSources.read(true, true, null, null,
41                  Arrays.copyOfRange(args, 0, index));
42  
43          final RDFProcessor processor = RDFProcessors.parse(true,
44                  "@rules " + String.join(" ", Arrays.copyOfRange(args, index + 1, args.length)));
45  
46          final int n = 10;
47          long ts = 0;
48          for (int i = 0; i < n; ++i) {
49              if (i == 5) {
50                  ts = System.currentTimeMillis();
51              }
52              processor.apply(source, RDFHandlers.NIL, 1);
53          }
54          System.out.println("Average: " + (System.currentTimeMillis() - ts) / (n - 5));
55      }
56  
57      private static void mainTemplate(final String... args) throws Throwable {
58  
59          int index = 0;
60          for (; index < args.length; ++index) {
61              if (args[index].equals("--")) {
62                  break;
63              }
64          }
65  
66          RDFSource source = RDFSources.read(true, true, null, null,
67                  Arrays.copyOfRange(args, 0, index));
68  
69          final List<Statement> statements = new ArrayList<>();
70          source.emit(RDFHandlers.wrap(statements), 1);
71          source = RDFSources.wrap(statements);
72  
73          System.out.println(statements.size());
74  
75          final long t = System.nanoTime();
76          final Value[] array = new Value[4];
77          final AtomicInteger counter = new AtomicInteger(0);
78          for (int i = 0; i < 1000000; ++i) {
79              for (final Statement stmt : statements) {
80  
81                  method1(stmt.getSubject(), stmt.getPredicate(), stmt.getObject(),
82                          stmt.getContext(), array, 0);
83                  counter.addAndGet(array[1].hashCode() + array[3].hashCode());
84  
85                  // method2(stmt.getSubject(), stmt.getPredicate(), stmt.getObject(),
86                  // stmt.getContext(), (final Resource s, final URI p, final Value o,
87                  // final Resource c) -> {
88                  // counter.addAndGet(p.hashCode() + c.hashCode());
89                  // });
90  
91                  // Statement stmt2 = method3(stmt);
92                  // counter.addAndGet(stmt2.getPredicate().hashCode() +
93                  // stmt2.getContext().hashCode());
94              }
95          }
96          System.out.println((System.nanoTime() - t) / 1000000);
97          System.out.println(counter);
98      }
99  
100     // method2 14.4 14.5 14.3 14.3
101     // method1/method3 10.0 10.0 10.0
102 
103     private static void method1(final Resource s, final URI p, final Value o, final Resource c,
104             final Value[] out, int offset) {
105         out[offset++] = s;
106         out[offset++] = OWL.SAMEAS;
107         out[offset++] = s;
108         out[offset++] = OWL.THING;
109     }
110 
111     private static void method2(final Resource s, final URI p, final Value o, final Resource c,
112             final QuadHandler handler) {
113         handler.handle(s, OWL.SAMEAS, s, OWL.THING);
114     }
115 
116     private static interface QuadHandler {
117 
118         void handle(Resource s, URI p, Value o, Resource c);
119 
120     }
121 
122     private static Statement method3(final Statement s) {
123         return new ContextStatementImpl(s.getSubject(), OWL.SAMEAS, s.getSubject(), OWL.THING);
124     }
125 
126 }