giovedì 7 novembre 2013

Oracle - Query - Paginated result with row_number()

Query per eseguire un subset delle row su oracle senza intaccare i parametri di orderby


SELECT *
FROM
  (SELECT FIELDA,
    FIELDB,
    FIELDC,
    ROW_NUMBER() OVER (ORDER BY FIELDC) R
  FROM TABLE_NAME
  WHERE FIELDA = 10
  )
WHERE R >= 10
AND R   <= 15;





lunedì 14 ottobre 2013

MongoDB + Java + Query + java.util.Date() Range

eseguendo questo codice:

final DBObject query = new BasicDBObject("field_1", new BasicDBObject("$exists", false))
.append("field_2", new BasicDBObject("$exists", true))
.append("field_3", new BasicDBObject("$exists", true))
.append("time", new BasicDBObject("$gte", new Date()));


System.out.println("----> query " + query.toString());

vi restituirà:

{ "field_1" : { "$exists" : false} , "field_2" : { "$exists" : true} , "field_3" : { "$exists" : true} , "time" : { "$gte" : { "$date" : "2013-10-09T15:53:18.649Z"}}}

e invece la query viene eseguita correttamente, se voi prende questa query e la lanciate dalla shell di mongo non funziona.... ma in realtà eseguita dai driver di mongo funziona!!!!

Quindi la query visualizzata vi sta mentendo!!!!

scusate sono impazzito 2 ore per capirlo....














martedì 24 settembre 2013

MongoDB + Morphia + Model to Map/Reduce Result with complex id

Alle volte capita di avere una collection risultante da una Map Reduce con un field id complesso.
Dopo varie ricerche ed esperimenti la soluzioni si trova agganciando come id una classe in embed:

la collection risultante della mapReduce:

{
"_id" : {
"time" : "2011-03",
"url" : "www.test.it",
"fast" : "c80"
},
"value" : 12
}



la classe di modello di result:

@Entity(value = "Stats.CountSingleUrl", noClassnameStored = true)
public class MRResult {

    @Id
    @Embedded
    @Indexed(value = IndexDirection.ASC, unique = true, dropDups = true)
    private IdObject id;
    private String value;

   ///... GETTER e SETTER

    public static class IdObject {

        private String time;
        private String url;
        private String fast;

     ///... GETTER e SETTER
    }
}

domenica 25 agosto 2013

martedì 23 luglio 2013

Oracle + Procedure + Tomcat + Connection Pool + Ibatis



Utilizzando il connection pool di tomcat via app attrraverso ibatis/mybatis  alcune chiamate a Store Procedure Oracle generavano errore
Caused by: java.lang.RuntimeException: unexpected invocation exception: unexpected invocation exception: null at oracle.ucp.jdbc.proxy.PreparedStatementProxyFactory.invoke(PreparedStatementProxyFactory.java:138) at oracle.ucp.jdbc.proxy.CallableStatementProxyFactory.invoke(CallableStatementProxyFactory.java:101) at $Proxy17.getResultSet(Unknown Source) at com.ibatis.sqlmap.engine.execution.SqlExecutor.getFirstResultSet(SqlExecutor.java:337) at com.ibatis.sqlmap.engine.execution.SqlExecutor.handleMultipleResults(SqlExecutor.java:299) at com.ibatis.sqlmap.engine.execution.SqlExecutor.executeQueryProcedure(SqlExecutor.java:283) at com.ibatis.sqlmap.engine.mapping.statement.ProcedureStatement.sqlExecuteQuery(ProcedureStatement.java:34) at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryWithCallback(GeneralStatement.java:173)

La soluzione è semplicemente NON chiamare le procedure con ibatis.callProcedure() ma con ibatis.update()


[via]

venerdì 12 luglio 2013

Certificazioni MongoDB 10gen

Sono disponibili i corsi gratuiti della 10gen con relativa certificazione di MongoDB.





mercoledì 1 maggio 2013

MongoDB Index


Visualizzare gli indici presenti sul db

use test;
db.system.indexes.find();

Visualizzare gli indici presenti sulla colection

db.<collection_name>.getIndexes()

Crea l' indice univoco eliminando le chiavi duplicate

db.accounts.ensureIndex( { username: 1 }, { unique: true, dropDups: true )

Creare un indice su elementi che possono anche non esserci nell'elenco dei documenti

db.addresses.ensureIndex( { "size": 1 }, { unique: true, sparse: true } )

Index Size

db.<collection_name>.indexSize();

Forzare l'uso di uno specifico indice

db.users.find().hint( { age: 1 } )

Elimina l'uso degli indici

db.people.find().hint({$natural:1})
Note:
  • l'indice _id per default è sempre univoco anche se non specificato sulla getIndexes()
  • L'indice di default viene creato di tipo BTREE
  • In caso di utilizzo di query su indice sparse le query default non ritornano i documenti che non posseggono quel field.