Would it make sense to make this part of oak-run instead?

2016-12-01 11:59 GMT+01:00  <thom...@apache.org>:
> Author: thomasm
> Date: Thu Dec  1 10:59:55 2016
> New Revision: 1772167
>
> URL: http://svn.apache.org/viewvc?rev=1772167&view=rev
> Log:
> OAK-1884 Query: log file analyzer tool
>
> Added:
>     
> jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/QueryShapeTool.java
>
> Added: 
> jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/QueryShapeTool.java
> URL: 
> http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/QueryShapeTool.java?rev=1772167&view=auto
> ==============================================================================
> --- 
> jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/QueryShapeTool.java
>  (added)
> +++ 
> jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/query/QueryShapeTool.java
>  Thu Dec  1 10:59:55 2016
> @@ -0,0 +1,92 @@
> +/*
> + * Licensed to the Apache Software Foundation (ASF) under one or more
> + * contributor license agreements.  See the NOTICE file distributed with
> + * this work for additional information regarding copyright ownership.
> + * The ASF licenses this file to You under the Apache License, Version 2.0
> + * (the "License"); you may not use this file except in compliance with
> + * the License.  You may obtain a copy of the License at
> + *
> + *      http://www.apache.org/licenses/LICENSE-2.0
> + *
> + * Unless required by applicable law or agreed to in writing, software
> + * distributed under the License is distributed on an "AS IS" BASIS,
> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
> + * See the License for the specific language governing permissions and
> + * limitations under the License.
> + */
> +package org.apache.jackrabbit.oak.query;
> +
> +import java.io.BufferedReader;
> +import java.io.File;
> +import java.io.FileReader;
> +import java.io.IOException;
> +import java.io.LineNumberReader;
> +import java.util.TreeSet;
> +
> +/**
> + * A tool that converts a list of queries to parameterized queries. This for
> + * example allows to extract unique queries.
> + */
> +public class QueryShapeTool {
> +
> +    public static void main(String... args) throws IOException {
> +        process(new File(args[0]));
> +    }
> +
> +    public static void process(File file) throws IOException {
> +        processFile(file);
> +    }
> +
> +    private static void processFile(File file) throws IOException {
> +        if (file.isDirectory()) {
> +            for (File f : file.listFiles()) {
> +                processFile(f);
> +            }
> +            return;
> +        }
> +        System.out.println("File " + file);
> +        LineNumberReader r = new LineNumberReader(new BufferedReader(
> +                new FileReader(file)));
> +        try {
> +            process(r);
> +        } finally {
> +            r.close();
> +        }
> +        System.out.println();
> +    }
> +
> +    private static void process(LineNumberReader reader) throws IOException {
> +        TreeSet<String> sortedUnique = new  TreeSet<String>();
> +        while (true) {
> +            String line = reader.readLine();
> +            if (line == null) {
> +                break;
> +            }
> +            sortedUnique.add(shape(line));
> +        }
> +        for (String s : sortedUnique) {
> +            System.out.println(s);
> +        }
> +    }
> +
> +    private static String shape(String query) {
> +        String result = query;
> +        // replace double quoted string literals with "$s"
> +        result = result.replaceAll("\"[^\"]*\"", "\\$s");
> +        // replace single quoted string literals with "$s"
> +        result = result.replaceAll("'[^\']*\'", "\\$s");
> +        // replace repeated "$s" with a single one (due to escape characters 
> in string literals)
> +        result = result.replaceAll("(\\$s)+", "\\$s");
> +
> +        // xpath: replace "//" with "/ /" so we can more easily stop there
> +        result = result.replaceAll("//", "/ /");
> +        // xpath: replace "/element(" with "/ element" for the same reason
> +        result = result.replaceAll("/element\\(", "/ element\\(");
> +        // xpath: replace "/text(" with "/ text" for the same reason
> +        result = result.replaceAll("/text\\(", "/ text\\(");
> +        // xpath: replace a path at the beginning of the query with $path
> +        result = result.replaceAll("/jcr:root(/([^ /]*))*[ /]", 
> "/jcr:root/\\$path/");
> +        return result;
> +    }
> +
> +}
> \ No newline at end of file
>
>

Reply via email to