CouchDB and Ektorp usage in Java API
CouchDB is a NoSQL (not only SQL) database system. It is not a traditional database rather than it is a schema free, non-relational and table-less database system. All records are stored here as document. Ektorp is a persistence tool used by CouchDB. In this document I have explained
How Ektorp is used within Java API
How Ektorp get CouchDb connection
How Ektorp create view and apply query
Create a file couchdb.properties and add to the classpath. The content would be as follows:
couchdb.name=opensrp
host=localhost
port=5984
maxConnections=20
connectionTimeout=1000
socketTimeout=10000
autoUpdateViewOnChange=true
Include the file to the context file and add connection information to the bean class
-----------------------------------------------------------------------
<util:properties id="opensrp" location="classpath:/couchdb.properties"/>
-----------------------------------------------------------------------
<bean id="opensrpDatabaseConnector" class="org.ektorp.impl.StdCouchDbConnector">
<constructor-arg value="${couchdb.name}"/>
<constructor-arg ref="couchDbInstance"/>
</bean>
<bean id="couchDbInstance" class="org.ektorp.impl.StdCouchDbInstance">
<constructor-arg>
<bean class="org.ektorp.spring.HttpClientFactoryBean" />
</constructor-arg>
</bean>
-------------------------------------------------------------------------------------------------------
3. Create entity class as like as the following example:
@TypeDiscriminator("doc.type === 'EligibleCouple'")
public class EligibleCouple extends CouchDbDocument {
@JsonProperty
private String caseId;
@JsonProperty
private String anmIdentifier;
@JsonProperty
private String firstName;
@JsonProperty
private String lastName;
@JsonProperty
private String dateOfBirth;
public EligibleCouple() {
}
public EligibleCouple withANMIdentifier(String anmIdentifier) {
this.anmIdentifier = anmIdentifier;
return this;
}
public EligibleCouple withFirstName(String firstName) {
this.firstName = firstName;
return this;
}
public EligibleCouple withLastName(String lastName) {
this.lastName = lastName;
return this;
}
public EligibleCouple withDateOfBirth(String dateOfBirth) {
this.dateOfBirth = dateOfBirth;
return this;
}
}
4. Create a Repository class using the following structure
@Repository
public class AllEligibleCouples extends CouchDbRepositorySupport<EligibleCouple> {
public static final String OPENSRP_DATABASE_CONNECTOR = "opensrpDatabaseConnector";
@Autowired
public AllEligibleCouples(@Qualifier(OPENSRP_DATABASE_CONNECTOR) CouchDbConnector db) {
super(EligibleCouple.class, db);
}
@GenerateView
public EligibleCouple findByCaseId(String caseId) {
List<EligibleCouple> couples = queryView("by_caseId", caseId);
if (couples == null || couples.isEmpty()) {
return null;
}
return couples.get(0);
}
@View(name = "all_ecs", map = "function(doc) { if (doc.type === 'EligibleCouple') { emit(doc.anmIdentifier); } }")
public List<EligibleCouple> all(String anmIdentifier) {
return db.queryView(createQuery("all_ecs").key(anmIdentifier).includeDocs(true), EligibleCouple.class);
}
There two type of view can be created. One is by @GenerateView annotation and another is by @View annotation
5. Call repository class within a service class
@Service
public class ECService {
private AllEligibleCouples allEligibleCouples;
@Autowired
public ECService(AllEligibleCouples allEligibleCouples) {
this.allEligibleCouples = allEligibleCouples;
}
public EligibleCouple getECByCaseId(String caseId)
{
EligibleCouple eligibleCouple = allEligibleCouples.findByCaseId(caseId);
return eligibleCouple;
}
public List<EligibleCouple> getAllECsByANMId(String caseId)
{
List<EligibleCouple> ecs = allEligibleCouples.all(anmIdentifier);
return ecs;
}
}
Now use the service class as your need.
Cheers !
This site is no longer maintained. Please visit docs.opensrp.io for current documentation.