/*
* Copyright 2012 NGDATA nv
*
* Licensed 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.lilyproject.tools.scanner.cli;
import java.io.File;
import java.io.FileInputStream;
import java.util.Date;
import org.codehaus.jackson.JsonNode;
import org.lilyproject.repository.api.LRepository;
import org.lilyproject.repository.api.LTable;
import org.lilyproject.repository.api.QName;
import org.lilyproject.repository.api.Record;
import org.lilyproject.repository.api.RecordScan;
import org.lilyproject.repository.api.RecordScanner;
import org.lilyproject.repository.api.ReturnFields;
import org.lilyproject.repository.api.filter.RecordFilterList;
import org.lilyproject.repository.api.filter.RecordFilterList.Operator;
import org.lilyproject.repository.api.filter.RecordTypeFilter;
import org.lilyproject.tools.import_.json.RecordScanReader;
import org.lilyproject.util.json.JsonFormat;
import org.lilyproject.util.repo.PrintUtil;
public class RecordScanTool {
private LRepository repository;
private LTable table;
private static int DEFAULT_CACHE = 1024;
private static boolean DEFAULT_CACHE_BLOCKS = false;
public static void count(LRepository repository, LTable table) throws Exception {
count(repository, table, null, null);
}
public static void count(LRepository repository, LTable table, String startId, String stopId) throws Exception {
count(repository, table, startId, stopId, null, null);
}
public static void count(LRepository repository, LTable table, String startId, String stopId,
String recordTypeFilter, File configFile) throws Exception {
new RecordScanTool(repository, table).count(startId, stopId, recordTypeFilter, configFile);
}
public static void print(LRepository repository, LTable table) throws Exception {
print(repository, table, -1L);
}
public static void print(LRepository repository, LTable table, long limit) throws Exception {
print(repository, table, limit, null);
}
public static void print(LRepository repository, LTable table, long limit, File config) throws Exception {
print(repository, table, null, null, limit, null, config);
}
public static void print(LRepository repository, LTable table, String startId, String stopId, long limit,
String recordTypeFilter, File config) throws Exception {
new RecordScanTool(repository, table).print(startId, stopId, limit, recordTypeFilter, config);
}
public RecordScanTool(LRepository repository, LTable table) {
this.repository = repository;
this.table = table;
}
public void count(String startId, String stopId, String recordTypeFilter, File configFile) throws Exception {
System.out.println("Counting records");
RecordScan scan = createRecordScan(startId, stopId, recordTypeFilter, configFile);
if (configFile == null) {
// We don't need to return fields for counting
scan.setReturnFields(ReturnFields.NONE);
}
RecordScanner scanner = table.getScanner(scan);
Record record;
Date start = new Date();
try {
int i = 0;
while ((record = scanner.next()) != null) {
i++;
if (i % 1000 == 0) {
System.out.println("Record no° : " + i + ", Record id : " + record.getId() );
}
}
Date stop = new Date();
System.out.println("Found " + i + " records in " + ((stop.getTime() - start.getTime()) / 1000f) + "s");
} finally {
scanner.close();
}
}
public void print(String startId, String stopId, long limit, String recordTypeFilter, File configFile) throws Exception {
if (limit < 0) {
limit = Long.MAX_VALUE;
}
RecordScan scan = createRecordScan(startId, stopId, recordTypeFilter, configFile);
RecordScanner scanner = table.getScanner(scan);
try {
int i = 0;
Record record;
while ((record = scanner.next()) != null && i < limit) {
i++;
PrintUtil.print(record, repository);
}
} finally {
scanner.close();
}
}
private RecordScan createRecordScan(String startId, String stopId, String recordTypeFilter, File scanConfFile) throws Exception {
RecordScan scan = null;
if (scanConfFile != null) {
JsonNode jsonNode = JsonFormat.deserializeNonStd(new FileInputStream(scanConfFile));
scan = RecordScanReader.INSTANCE.fromJson(jsonNode, repository);
}
scan = scan != null ? scan : new RecordScan();
scan.setCaching(RecordScanTool.DEFAULT_CACHE);
scan.setCacheBlocks(DEFAULT_CACHE_BLOCKS);
if (startId != null && startId.length() > 0) {
scan.setStartRecordId(repository.getIdGenerator().fromString(startId));
}
if (stopId != null && stopId.length() > 0) {
scan.setStopRecordId(repository.getIdGenerator().fromString(stopId));
}
if (recordTypeFilter != null && !recordTypeFilter.isEmpty()) {
RecordFilterList filterList = new RecordFilterList(Operator.MUST_PASS_ONE);
if (scan.getRecordFilter() != null) {
filterList.addFilter(scan.getRecordFilter());
}
scan.setRecordFilter(filterList);
String[] recordTypes = recordTypeFilter.split(",");
for (String recordType : recordTypes) {
filterList.addFilter(new RecordTypeFilter(QName.fromString(recordType)));
}
}
return scan;
}
}