Skip to content

Commit

Permalink
creates interface
Browse files Browse the repository at this point in the history
  • Loading branch information
otaviojava committed Jun 27, 2019
1 parent 2bb52dd commit 9666be8
Show file tree
Hide file tree
Showing 4 changed files with 187 additions and 161 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,182 @@
/*
* Copyright (c) 2017 Otávio Santana and others
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* and Apache License v2.0 which accompanies this distribution.
* The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
* and the Apache License v2.0 is available at http://www.opensource.org/licenses/apache2.0.php.
*
* You may elect to redistribute this code under either of these licenses.
*
* Contributors:
*
* Otavio Santana
*/

package org.jnosql.diana.solr.document;

import jakarta.nosql.document.DocumentCollectionManager;
import jakarta.nosql.document.DocumentDeleteQuery;
import jakarta.nosql.document.DocumentEntity;
import jakarta.nosql.document.DocumentQuery;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrQuery.SortClause;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.HttpSolrClient;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrInputDocument;
import org.jnosql.diana.SettingsPriority;

import java.io.IOException;
import java.time.Duration;
import java.util.List;
import java.util.Locale;
import java.util.Objects;
import java.util.stream.StreamSupport;

import static java.util.stream.Collectors.toList;
import static org.jnosql.diana.solr.document.SolrUtils.getDocument;

/**
* The default implementation of {@link SolrBDocumentCollectionManager}
*/
class DefaultSolrBDocumentCollectionManager implements SolrBDocumentCollectionManager {

private final HttpSolrClient solrClient;

DefaultSolrBDocumentCollectionManager(HttpSolrClient solrClient) {
this.solrClient = solrClient;
}


@Override
public DocumentEntity insert(DocumentEntity entity) {
Objects.requireNonNull(entity, "entity is required");

try {
solrClient.add(getDocument(entity));
commit();
} catch (SolrServerException | IOException e) {
throw new SolrException("Error to insert/update a information", e);
}
return entity;
}

@Override
public DocumentEntity insert(DocumentEntity entity, Duration ttl) {
throw new UnsupportedOperationException("Apache Solr does not support save with TTL");
}

@Override
public Iterable<DocumentEntity> insert(Iterable<DocumentEntity> entities) {
Objects.requireNonNull(entities, "entities is required");
final List<SolrInputDocument> documents = StreamSupport.stream(entities.spliterator(), false)
.map(SolrUtils::getDocument).collect(toList());
try {
solrClient.add(documents);
commit();
} catch (SolrServerException | IOException e) {
throw new SolrException("Error to insert/update a information", e);
}
return entities;
}

@Override
public Iterable<DocumentEntity> insert(Iterable<DocumentEntity> entities, Duration ttl) {
Objects.requireNonNull(entities, "entities is required");
Objects.requireNonNull(ttl, "ttl is required");
return StreamSupport.stream(entities.spliterator(), false)
.map(e -> insert(e, ttl))
.collect(toList());
}


@Override
public DocumentEntity update(DocumentEntity entity) {
return insert(entity);
}

@Override
public Iterable<DocumentEntity> update(Iterable<DocumentEntity> entities) {
Objects.requireNonNull(entities, "entities is required");
return StreamSupport.stream(entities.spliterator(), false)
.map(this::update)
.collect(toList());
}


@Override
public void delete(DocumentDeleteQuery query) {
Objects.requireNonNull(query, "query is required");
try {
solrClient.deleteByQuery(DocumentQueryConversor.convert(query));
commit();
} catch (SolrServerException | IOException e) {
throw new SolrException("Error to delete at Solr", e);
}
}

@Override
public List<DocumentEntity> select(DocumentQuery query) {
Objects.requireNonNull(query, "query is required");
try {
SolrQuery solrQuery = new SolrQuery();
final String queryExpression = DocumentQueryConversor.convert(query);
solrQuery.set("q", queryExpression);
if (query.getSkip() > 0) {
solrQuery.setStart((int) query.getSkip());
}
if (query.getLimit() > 0) {
solrQuery.setRows((int) query.getLimit());
}
final List<SortClause> sorts = query.getSorts().stream()
.map(s -> new SortClause(s.getName(), s.getType().name().toLowerCase(Locale.US)))
.collect(toList());
solrQuery.setSorts(sorts);
final QueryResponse response = solrClient.query(solrQuery);
final SolrDocumentList documents = response.getResults();
return SolrUtils.of(documents);
} catch (SolrServerException | IOException e) {
throw new SolrException("Error to query at Solr", e);
}
}

@Override
public long count(String documentCollection) {
Objects.requireNonNull(documentCollection, "documentCollection is required");

try {
SolrQuery solrQuery = new SolrQuery();
solrQuery.set("q", "_entity:" + documentCollection);
solrQuery.setRows(0);
final QueryResponse response = solrClient.query(solrQuery);
return response.getResults().getNumFound();
} catch (SolrServerException | IOException e) {
throw new SolrException("Error to query at Solr", e);
}
}

@Override
public void close() {

}

private void commit() {
if (isAutomaticCommit()) {
try {
solrClient.commit();
} catch (SolrServerException | IOException e) {
throw new SolrException("Error to commit at Solr", e);
}
}
}

private Boolean isAutomaticCommit() {
return SettingsPriority.get("jakarta.nosql.transaction")
.map(Object::toString)
.map(Boolean::parseBoolean).orElse(true);
}


}
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2017 Otávio Santana and others
* Copyright (c) 2019 Otávio Santana and others
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* and Apache License v2.0 which accompanies this distribution.
Expand All @@ -12,172 +12,16 @@
*
* Otavio Santana
*/

package org.jnosql.diana.solr.document;

import jakarta.nosql.document.DocumentCollectionManager;
import jakarta.nosql.document.DocumentDeleteQuery;
import jakarta.nosql.document.DocumentEntity;
import jakarta.nosql.document.DocumentQuery;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrQuery.SortClause;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.HttpSolrClient;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrInputDocument;
import org.jnosql.diana.SettingsPriority;

import java.io.IOException;
import java.time.Duration;
import java.util.List;
import java.util.Locale;
import java.util.Objects;
import java.util.stream.StreamSupport;

import static java.util.stream.Collectors.toList;
import static org.jnosql.diana.solr.document.SolrUtils.getDocument;

/**
* The solr implementation to {@link DocumentCollectionManager} that does not support TTL methods
* <p>{@link SolrBDocumentCollectionManager#insert(DocumentEntity, Duration)}</p>
* <p>{@link DefaultSolrBDocumentCollectionManager#insert(DocumentEntity, Duration)}</p>
*/
public class SolrBDocumentCollectionManager implements DocumentCollectionManager {

private final HttpSolrClient solrClient;

SolrBDocumentCollectionManager(HttpSolrClient solrClient) {
this.solrClient = solrClient;
}


@Override
public DocumentEntity insert(DocumentEntity entity) {
Objects.requireNonNull(entity, "entity is required");

try {
solrClient.add(getDocument(entity));
commit();
} catch (SolrServerException | IOException e) {
throw new SolrException("Error to insert/update a information", e);
}
return entity;
}

@Override
public DocumentEntity insert(DocumentEntity entity, Duration ttl) {
throw new UnsupportedOperationException("Apache Solr does not support save with TTL");
}

@Override
public Iterable<DocumentEntity> insert(Iterable<DocumentEntity> entities) {
Objects.requireNonNull(entities, "entities is required");
final List<SolrInputDocument> documents = StreamSupport.stream(entities.spliterator(), false)
.map(SolrUtils::getDocument).collect(toList());
try {
solrClient.add(documents);
commit();
} catch (SolrServerException | IOException e) {
throw new SolrException("Error to insert/update a information", e);
}
return entities;
}

@Override
public Iterable<DocumentEntity> insert(Iterable<DocumentEntity> entities, Duration ttl) {
Objects.requireNonNull(entities, "entities is required");
Objects.requireNonNull(ttl, "ttl is required");
return StreamSupport.stream(entities.spliterator(), false)
.map(e -> insert(e, ttl))
.collect(toList());
}


@Override
public DocumentEntity update(DocumentEntity entity) {
return insert(entity);
}

@Override
public Iterable<DocumentEntity> update(Iterable<DocumentEntity> entities) {
Objects.requireNonNull(entities, "entities is required");
return StreamSupport.stream(entities.spliterator(), false)
.map(this::update)
.collect(toList());
}


@Override
public void delete(DocumentDeleteQuery query) {
Objects.requireNonNull(query, "query is required");
try {
solrClient.deleteByQuery(DocumentQueryConversor.convert(query));
commit();
} catch (SolrServerException | IOException e) {
throw new SolrException("Error to delete at Solr", e);
}
}

@Override
public List<DocumentEntity> select(DocumentQuery query) {
Objects.requireNonNull(query, "query is required");
try {
SolrQuery solrQuery = new SolrQuery();
final String queryExpression = DocumentQueryConversor.convert(query);
solrQuery.set("q", queryExpression);
if (query.getSkip() > 0) {
solrQuery.setStart((int) query.getSkip());
}
if (query.getLimit() > 0) {
solrQuery.setRows((int) query.getLimit());
}
final List<SortClause> sorts = query.getSorts().stream()
.map(s -> new SortClause(s.getName(), s.getType().name().toLowerCase(Locale.US)))
.collect(toList());
solrQuery.setSorts(sorts);
final QueryResponse response = solrClient.query(solrQuery);
final SolrDocumentList documents = response.getResults();
return SolrUtils.of(documents);
} catch (SolrServerException | IOException e) {
throw new SolrException("Error to query at Solr", e);
}
}

@Override
public long count(String documentCollection) {
Objects.requireNonNull(documentCollection, "documentCollection is required");

try {
SolrQuery solrQuery = new SolrQuery();
solrQuery.set("q", "_entity:" + documentCollection);
solrQuery.setRows(0);
final QueryResponse response = solrClient.query(solrQuery);
return response.getResults().getNumFound();
} catch (SolrServerException | IOException e) {
throw new SolrException("Error to query at Solr", e);
}
}

@Override
public void close() {

}

private void commit() {
if (isAutomaticCommit()) {
try {
solrClient.commit();
} catch (SolrServerException | IOException e) {
throw new SolrException("Error to commit at Solr", e);
}
}
}

private Boolean isAutomaticCommit() {
return SettingsPriority.get("jakarta.nosql.transaction")
.map(Object::toString)
.map(Boolean::parseBoolean).orElse(true);
}


public interface SolrBDocumentCollectionManager extends DocumentCollectionManager {
}
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ public class SolrDocumentCollectionManagerFactory implements DocumentCollectionM
public SolrBDocumentCollectionManager get(String database) {
Objects.requireNonNull(database, "database is required");
final String baseURL = solrClient.getBaseURL() + '/' + database;
return new SolrBDocumentCollectionManager(new HttpSolrClient.Builder(baseURL).build());
return new DefaultSolrBDocumentCollectionManager(new HttpSolrClient.Builder(baseURL).build());
}


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;

public class SolrBDocumentCollectionManagerTest {
public class DefaultSolrBDocumentCollectionManagerTest {

public static final String COLLECTION_NAME = "person";
public static final String ID = "id";
Expand Down

0 comments on commit 9666be8

Please sign in to comment.