Hi all,

I was just wondering if anybody else has run into a similar issue before.
I’m trying to create a wrapper class for the org.apache.lucene.search.similarities.SimilarityBase class within PyLucene (similar to the existing wrapper for PythonClassicSimilarity).

However, upon re-building and re-installing PyLucene, when trying to use the wrapper class it fails with the following exception:

java.lang.UnsatisfiedLinkError: org.apache.pylucene.search.similarities.PythonSimilarityBase.score(Lorg/apache/lucene/search/similarities/BasicStats;FF)F

Upon examination of the wrap0*.cpp files, and comparing with PythonClassicSimilarity, I found that the score method is not being generated. E.g.

static PyMethodDef t_PythonSimilarityBase__methods_[] = {
            DECLARE_METHOD(t_PythonSimilarityBase, cast_, METH_O | METH_CLASS),
            DECLARE_METHOD(t_PythonSimilarityBase, instance_, METH_O | METH_CLASS),
            DECLARE_METHOD(t_PythonSimilarityBase, finalize, METH_NOARGS),
            DECLARE_METHOD(t_PythonSimilarityBase, pythonExtension, METH_VARARGS),
            { NULL, NULL, 0, NULL }
          };

and

JNINativeMethod methods[] = {
              { "pythonDecRef", "()V", (void *) t_PythonSimilarityBase_pythonDecRef0 },
              { "toString", "()Ljava/lang/String;", (void *) t_PythonSimilarityBase_toString1 },
            };

But it is present in the header file enum…
 class PythonSimilarityBase : public ::org::apache::lucene::search::similarities::SimilarityBase {
          public:
            enum {
              mid_init$_7353aa4eb69a6f70,
              mid_finalize_7353aa4eb69a6f70,
              mid_pythonDecRef_7353aa4eb69a6f70,
              mid_pythonExtension_aae05472994e7446,
              mid_pythonExtension_f41cd3dc7c7d5d78,
              mid_toString_5df7257cf25bf439,
              mid_score_a6c8466c4349b376,
              max_mid
            };

But not in the header file methods.
PythonSimilarityBase();

            void finalize() const;
            void pythonDecRef() const;
            jlong pythonExtension() const;
            void pythonExtension(jlong) const;
            ::java::lang::String toString() const;
Compared to
static PyMethodDef t_PythonClassicSimilarity__methods_[] = {
            DECLARE_METHOD(t_PythonClassicSimilarity, cast_, METH_O | METH_CLASS),
            DECLARE_METHOD(t_PythonClassicSimilarity, instance_, METH_O | METH_CLASS),
            DECLARE_METHOD(t_PythonClassicSimilarity, coord, METH_VARARGS),
            DECLARE_METHOD(t_PythonClassicSimilarity, finalize, METH_NOARGS),
            DECLARE_METHOD(t_PythonClassicSimilarity, idf, METH_VARARGS),
            DECLARE_METHOD(t_PythonClassicSimilarity, idfExplain, METH_VARARGS),
            DECLARE_METHOD(t_PythonClassicSimilarity, lengthNorm, METH_VARARGS),
            DECLARE_METHOD(t_PythonClassicSimilarity, pythonExtension, METH_VARARGS),
            DECLARE_METHOD(t_PythonClassicSimilarity, queryNorm, METH_VARARGS),
            DECLARE_METHOD(t_PythonClassicSimilarity, sloppyFreq, METH_VARARGS),
            DECLARE_METHOD(t_PythonClassicSimilarity, tf, METH_VARARGS),
            { NULL, NULL, 0, NULL }
          };

and

JNINativeMethod methods[] = {
              { "coord", "(II)F", (void *) t_PythonClassicSimilarity_coord0 },
              { "idf", "(JJ)F", (void *) t_PythonClassicSimilarity_idf1 },
              { "idfExplain", "(Lorg/apache/lucene/search/CollectionStatistics;[Lorg/apache/lucene/search/TermStatistics;)Lorg/apache/lucene/search/Explanation;", (void *) t_PythonClassicSimilarity_idfExplain2 },
              { "lengthNorm", "(Lorg/apache/lucene/index/FieldInvertState;)F", (void *) t_PythonClassicSimilarity_lengthNorm3 },
              { "pythonDecRef", "()V", (void *) t_PythonClassicSimilarity_pythonDecRef4 },
              { "queryNorm", "(F)F", (void *) t_PythonClassicSimilarity_queryNorm5 },
              { "sloppyFreq", "(I)F", (void *) t_PythonClassicSimilarity_sloppyFreq6 },
              { "tf", "(F)F", (void *) t_PythonClassicSimilarity_tf7 },
            };
enum {
              mid_init$_7353aa4eb69a6f70,
              mid_coord_78a3b70e2a43b9c7,
              mid_finalize_7353aa4eb69a6f70,
              mid_idf_0af4b58f982c0dd1,
              mid_idfExplain_08e4e4733921c6f1,
              mid_lengthNorm_a7d67c4cd2e3b6a2,
              mid_pythonDecRef_7353aa4eb69a6f70,
              mid_pythonExtension_aae05472994e7446,
              mid_pythonExtension_f41cd3dc7c7d5d78,
              mid_queryNorm_eecff9f314592ce9,
              mid_sloppyFreq_6b1faadec3ed3278,
              mid_tf_eecff9f314592ce9,
              max_mid
            };

and

jfloat coord(jint, jint) const;
            void finalize() const;
            jfloat idf(jlong, jlong) const;
            ::org::apache::lucene::search::Explanation idfExplain(const ::org::apache::lucene::search::CollectionStatistics &, const JArray< ::org::apache::lucene::search::TermStatistics > &) const;
            jfloat lengthNorm(const ::org::apache::lucene::index::FieldInvertState &) const;
            void pythonDecRef() const;
            jlong pythonExtension() const;
            void pythonExtension(jlong) const;
            jfloat queryNorm(jfloat) const;
            jfloat sloppyFreq(jint) const;
            jfloat tf(jfloat) const;

Here is the code for PythonSimilarityBase.java (stored in the same directory as PythonClassicSimilarity) which compiles without issues:
package org.apache.pylucene.search.similarities;

import org.apache.lucene.search.similarities.BasicStats;
import org.apache.lucene.search.similarities.SimilarityBase;

public class PythonSimilarityBase extends SimilarityBase {

    private long pythonObject;

    public PythonSimilarityBase()
    {
    }

    public void pythonExtension(long pythonObject)
    {
        this.pythonObject = pythonObject;
    }
    public long pythonExtension()
    {
        return this.pythonObject;
    }

    public void finalize()
        t
NEW: Monitor These Apps!
elasticsearch, apache solr, apache hbase, hadoop, redis, casssandra, amazon cloudwatch, mysql, memcached, apache kafka, apache zookeeper, apache storm, ubuntu, centOS, red hat, debian, puppet labs, java, senseiDB